1 USING: tools.test kernel combinators.short-circuit math sequences accessors
4 compiler.tree.combinators
5 compiler.tree.recursive
6 compiler.tree.recursive.private ;
7 IN: compiler.tree.recursive.tests
9 [ { f f f f } ] [ f { f t f f } (tail-calls) ] unit-test
10 [ { f f f t } ] [ t { f t f f } (tail-calls) ] unit-test
11 [ { f t t t } ] [ t { f f t t } (tail-calls) ] unit-test
12 [ { f f f t } ] [ t { f f t f } (tail-calls) ] unit-test
14 : label-is-loop? ( nodes word -- ? )
18 [ drop label>> loop?>> ]
19 [ swap label>> word>> eq? ]
21 ] curry contains-node? ;
23 : label-is-not-loop? ( nodes word -- ? )
27 [ drop label>> loop?>> not ]
28 [ swap label>> word>> eq? ]
30 ] curry contains-node? ;
32 : loop-test-1 ( a -- )
33 dup [ 1 + loop-test-1 ] [ drop ] if ; inline recursive
36 [ loop-test-1 ] build-tree analyze-recursive
37 \ loop-test-1 label-is-loop?
41 [ loop-test-1 1 2 3 ] build-tree analyze-recursive
42 \ loop-test-1 label-is-loop?
46 [ [ loop-test-1 ] each ] build-tree analyze-recursive
47 \ loop-test-1 label-is-loop?
51 [ [ loop-test-1 ] each ] build-tree analyze-recursive
52 \ (each-integer) label-is-loop?
55 : loop-test-2 ( a b -- a' )
56 dup [ 1+ loop-test-2 1 - ] [ drop ] if ; inline recursive
59 [ loop-test-2 ] build-tree analyze-recursive
60 \ loop-test-2 label-is-not-loop?
63 : loop-test-3 ( a -- )
64 dup [ [ loop-test-3 ] each ] [ drop ] if ; inline recursive
67 [ loop-test-3 ] build-tree analyze-recursive
68 \ loop-test-3 label-is-not-loop?
72 [ [ [ ] map ] map ] build-tree analyze-recursive
74 dup #recursive? [ label>> loop?>> not ] [ drop f ] if
78 : blah ( -- value ) f ;
83 blah [ b ] [ a ] if ; inline recursive
86 blah [ b ] [ a ] if ; inline recursive
89 [ a ] build-tree analyze-recursive
94 [ a ] build-tree analyze-recursive
99 [ b ] build-tree analyze-recursive
104 [ a ] build-tree analyze-recursive
111 blah [ b' b' ] [ a' ] if ; inline recursive
114 blah [ b' ] [ a' ] if ; inline recursive
117 [ a' ] build-tree analyze-recursive
122 [ b' ] build-tree analyze-recursive
126 ! I used to think this should be f, but doing this on pen and
127 ! paper almost convinced me that a loop conversion here is
131 [ b' ] build-tree analyze-recursive
136 [ a' ] build-tree analyze-recursive
143 a'' ; inline recursive
146 dup [ b'' a'' ] when ; inline recursive
149 [ a'' ] build-tree analyze-recursive
150 \ a'' label-is-not-loop?
154 [ a'' ] build-tree analyze-recursive
159 [ b'' ] build-tree analyze-recursive
164 [ b'' ] build-tree analyze-recursive
165 \ b'' label-is-not-loop?
168 : loop-in-non-loop ( x quot: ( i -- ) -- )
170 [ [ 1 - ] dip loop-in-non-loop ] [ call ] 2bi
171 ] [ 2drop ] if ; inline recursive
174 [ 10 [ [ drop ] each-integer ] loop-in-non-loop ]
175 build-tree analyze-recursive
176 \ (each-integer) label-is-loop?
182 blah [ b''' ] [ a''' b''' ] if ; inline recursive
185 blah [ b''' ] [ a''' ] if ; inline recursive
188 [ b''' ] build-tree analyze-recursive
189 \ a''' label-is-loop?
194 : a4 ( a -- b ) dup [ b4 ] when ; inline recursive
196 : b4 ( a -- b ) dup [ a4 reverse ] when ; inline recursive
198 [ t ] [ [ b4 ] build-tree analyze-recursive \ a4 label-is-loop? ] unit-test
199 [ t ] [ [ b4 ] build-tree analyze-recursive \ b4 label-is-not-loop? ] unit-test
200 [ t ] [ [ a4 ] build-tree analyze-recursive \ a4 label-is-not-loop? ] unit-test
201 [ t ] [ [ a4 ] build-tree analyze-recursive \ b4 label-is-loop? ] unit-test