1 USING: tools.test kernel combinators.short-circuit math sequences accessors make
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 -- ? )
20 } 1&& [ label>> word>> , ] [ drop ] if
24 : label-is-not-loop? ( nodes word -- ? )
29 [ label>> loop?>> not ]
30 } 1&& [ label>> word>> , ] [ drop ] if
34 : loop-test-1 ( a -- )
35 dup [ 1 + loop-test-1 ] [ drop ] if ; inline recursive
38 [ loop-test-1 ] build-tree analyze-recursive
39 \ loop-test-1 label-is-loop?
43 [ loop-test-1 1 2 3 ] build-tree analyze-recursive
44 \ loop-test-1 label-is-loop?
48 [ [ loop-test-1 ] each ] build-tree analyze-recursive
49 \ loop-test-1 label-is-loop?
53 [ [ loop-test-1 ] each ] build-tree analyze-recursive
54 \ (each-integer) label-is-loop?
57 : loop-test-2 ( a b -- a' )
58 dup [ 1 + loop-test-2 1 - ] [ drop ] if ; inline recursive
61 [ loop-test-2 ] build-tree analyze-recursive
62 \ loop-test-2 label-is-not-loop?
65 : loop-test-3 ( a -- )
66 dup [ [ loop-test-3 ] each ] [ drop ] if ; inline recursive
69 [ loop-test-3 ] build-tree analyze-recursive
70 \ loop-test-3 label-is-not-loop?
74 [ [ [ ] map ] map ] build-tree analyze-recursive
76 dup #recursive? [ label>> loop?>> not ] [ drop f ] if
80 : blah ( -- value ) f ;
85 blah [ b ] [ a ] if ; inline recursive
88 blah [ b ] [ a ] if ; inline recursive
91 [ a ] build-tree analyze-recursive
96 [ a ] build-tree analyze-recursive
101 [ b ] build-tree analyze-recursive
106 [ a ] build-tree analyze-recursive
113 blah [ b' b' ] [ a' ] if ; inline recursive
116 blah [ b' ] [ a' ] if ; inline recursive
119 [ a' ] build-tree analyze-recursive
124 [ b' ] build-tree analyze-recursive
128 ! I used to think this should be f, but doing this on pen and
129 ! paper almost convinced me that a loop conversion here is
133 [ b' ] build-tree analyze-recursive
138 [ a' ] build-tree analyze-recursive
145 a'' ; inline recursive
148 dup [ b'' a'' ] when ; inline recursive
151 [ a'' ] build-tree analyze-recursive
152 \ a'' label-is-not-loop?
156 [ a'' ] build-tree analyze-recursive
161 [ b'' ] build-tree analyze-recursive
166 [ b'' ] build-tree analyze-recursive
167 \ b'' label-is-not-loop?
170 : loop-in-non-loop ( x quot: ( i -- ) -- )
172 [ [ 1 - ] dip loop-in-non-loop ] [ call ] 2bi
173 ] [ 2drop ] if ; inline recursive
176 [ 10 [ [ drop ] each-integer ] loop-in-non-loop ]
177 build-tree analyze-recursive
178 \ (each-integer) label-is-loop?
184 blah [ b''' ] [ a''' b''' ] if ; inline recursive
187 blah [ b''' ] [ a''' ] if ; inline recursive
190 [ b''' ] build-tree analyze-recursive
191 \ a''' label-is-loop?
196 : a4 ( a -- b ) dup [ b4 ] when ; inline recursive
198 : b4 ( a -- b ) dup [ a4 reverse ] when ; inline recursive
200 { t } [ [ b4 ] build-tree analyze-recursive \ a4 label-is-loop? ] unit-test
201 { t } [ [ b4 ] build-tree analyze-recursive \ b4 label-is-not-loop? ] unit-test
202 { t } [ [ a4 ] build-tree analyze-recursive \ a4 label-is-not-loop? ] unit-test
203 { t } [ [ a4 ] build-tree analyze-recursive \ b4 label-is-loop? ] unit-test