| 
									
										
										
										
											2008-09-12 06:17:27 -04:00
										 |  |  | IN: compiler.tree.recursive.tests | 
					
						
							|  |  |  | USING: compiler.tree.recursive tools.test | 
					
						
							| 
									
										
										
										
											2008-08-10 02:58:39 -04:00
										 |  |  | kernel combinators.short-circuit math sequences accessors | 
					
						
							|  |  |  | compiler.tree | 
					
						
							|  |  |  | compiler.tree.builder | 
					
						
							|  |  |  | compiler.tree.combinators ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [ { f f f f } ] [ f { f t f f } (tail-calls) ] unit-test | 
					
						
							|  |  |  | [ { f f f t } ] [ t { f t f f } (tail-calls) ] unit-test | 
					
						
							|  |  |  | [ { f t t t } ] [ t { f f t t } (tail-calls) ] unit-test | 
					
						
							|  |  |  | [ { f f f t } ] [ t { f f t f } (tail-calls) ] unit-test | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-09-12 06:17:27 -04:00
										 |  |  | \ analyze-recursive must-infer | 
					
						
							| 
									
										
										
										
											2008-08-10 02:58:39 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : label-is-loop? ( nodes word -- ? )
 | 
					
						
							|  |  |  |     [ | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             [ drop #recursive? ] | 
					
						
							|  |  |  |             [ drop label>> loop?>> ] | 
					
						
							|  |  |  |             [ swap label>> word>> eq? ] | 
					
						
							|  |  |  |         } 2&& | 
					
						
							|  |  |  |     ] curry contains-node? ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | \ label-is-loop? must-infer | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : label-is-not-loop? ( nodes word -- ? )
 | 
					
						
							|  |  |  |     [ | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             [ drop #recursive? ] | 
					
						
							|  |  |  |             [ drop label>> loop?>> not ] | 
					
						
							|  |  |  |             [ swap label>> word>> eq? ] | 
					
						
							|  |  |  |         } 2&& | 
					
						
							|  |  |  |     ] curry contains-node? ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | \ label-is-not-loop? must-infer | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : loop-test-1 ( a -- )
 | 
					
						
							|  |  |  |     dup [ 1+ loop-test-1 ] [ drop ] if ; inline recursive
 | 
					
						
							|  |  |  |                            | 
					
						
							|  |  |  | [ t ] [ | 
					
						
							| 
									
										
										
										
											2008-09-12 06:17:27 -04:00
										 |  |  |     [ loop-test-1 ] build-tree analyze-recursive | 
					
						
							| 
									
										
										
										
											2008-08-10 02:58:39 -04:00
										 |  |  |     \ loop-test-1 label-is-loop? | 
					
						
							|  |  |  | ] unit-test | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [ t ] [ | 
					
						
							| 
									
										
										
										
											2008-09-12 06:17:27 -04:00
										 |  |  |     [ loop-test-1 1 2 3 ] build-tree analyze-recursive | 
					
						
							| 
									
										
										
										
											2008-08-10 02:58:39 -04:00
										 |  |  |     \ loop-test-1 label-is-loop? | 
					
						
							|  |  |  | ] unit-test | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [ t ] [ | 
					
						
							| 
									
										
										
										
											2008-09-12 06:17:27 -04:00
										 |  |  |     [ [ loop-test-1 ] each ] build-tree analyze-recursive | 
					
						
							| 
									
										
										
										
											2008-08-10 02:58:39 -04:00
										 |  |  |     \ loop-test-1 label-is-loop? | 
					
						
							|  |  |  | ] unit-test | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [ t ] [ | 
					
						
							| 
									
										
										
										
											2008-09-12 06:17:27 -04:00
										 |  |  |     [ [ loop-test-1 ] each ] build-tree analyze-recursive | 
					
						
							| 
									
										
										
										
											2008-08-10 02:58:39 -04:00
										 |  |  |     \ (each-integer) label-is-loop? | 
					
						
							|  |  |  | ] unit-test | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : loop-test-2 ( a -- )
 | 
					
						
							|  |  |  |     dup [ 1+ loop-test-2 1- ] [ drop ] if ; inline recursive
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [ t ] [ | 
					
						
							| 
									
										
										
										
											2008-09-12 06:17:27 -04:00
										 |  |  |     [ loop-test-2 ] build-tree analyze-recursive | 
					
						
							| 
									
										
										
										
											2008-08-10 02:58:39 -04:00
										 |  |  |     \ loop-test-2 label-is-not-loop? | 
					
						
							|  |  |  | ] unit-test | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : loop-test-3 ( a -- )
 | 
					
						
							|  |  |  |     dup [ [ loop-test-3 ] each ] [ drop ] if ; inline recursive
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [ t ] [ | 
					
						
							| 
									
										
										
										
											2008-09-12 06:17:27 -04:00
										 |  |  |     [ loop-test-3 ] build-tree analyze-recursive | 
					
						
							| 
									
										
										
										
											2008-08-10 02:58:39 -04:00
										 |  |  |     \ loop-test-3 label-is-not-loop? | 
					
						
							|  |  |  | ] unit-test | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : loop-test-4 ( a -- )
 | 
					
						
							|  |  |  |     dup [ | 
					
						
							|  |  |  |         loop-test-4 | 
					
						
							|  |  |  |     ] [ | 
					
						
							|  |  |  |         drop
 | 
					
						
							|  |  |  |     ] if ; inline recursive
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [ f ] [ | 
					
						
							| 
									
										
										
										
											2008-09-12 06:17:27 -04:00
										 |  |  |     [ [ [ ] map ] map ] build-tree analyze-recursive | 
					
						
							| 
									
										
										
										
											2008-08-10 02:58:39 -04:00
										 |  |  |     [ | 
					
						
							|  |  |  |         dup #recursive? [ label>> loop?>> not ] [ drop f ] if
 | 
					
						
							|  |  |  |     ] contains-node? | 
					
						
							|  |  |  | ] unit-test | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : blah f ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | DEFER: a | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : b ( -- )
 | 
					
						
							|  |  |  |     blah [ b ] [ a ] if ; inline recursive
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : a ( -- )
 | 
					
						
							|  |  |  |     blah [ b ] [ a ] if ; inline recursive
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [ t ] [ | 
					
						
							| 
									
										
										
										
											2008-09-12 06:17:27 -04:00
										 |  |  |     [ a ] build-tree analyze-recursive | 
					
						
							| 
									
										
										
										
											2008-08-10 02:58:39 -04:00
										 |  |  |     \ a label-is-loop? | 
					
						
							|  |  |  | ] unit-test | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [ t ] [ | 
					
						
							| 
									
										
										
										
											2008-09-12 06:17:27 -04:00
										 |  |  |     [ a ] build-tree analyze-recursive | 
					
						
							| 
									
										
										
										
											2008-08-10 02:58:39 -04:00
										 |  |  |     \ b label-is-loop? | 
					
						
							|  |  |  | ] unit-test | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [ t ] [ | 
					
						
							| 
									
										
										
										
											2008-09-12 06:17:27 -04:00
										 |  |  |     [ b ] build-tree analyze-recursive | 
					
						
							| 
									
										
										
										
											2008-08-10 02:58:39 -04:00
										 |  |  |     \ a label-is-loop? | 
					
						
							|  |  |  | ] unit-test | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [ t ] [ | 
					
						
							| 
									
										
										
										
											2008-09-12 06:17:27 -04:00
										 |  |  |     [ a ] build-tree analyze-recursive | 
					
						
							| 
									
										
										
										
											2008-08-10 02:58:39 -04:00
										 |  |  |     \ b label-is-loop? | 
					
						
							|  |  |  | ] unit-test | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | DEFER: a' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : b' ( -- )
 | 
					
						
							|  |  |  |     blah [ b' b' ] [ a' ] if ; inline recursive
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : a' ( -- )
 | 
					
						
							|  |  |  |     blah [ b' ] [ a' ] if ; inline recursive
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [ f ] [ | 
					
						
							| 
									
										
										
										
											2008-09-12 06:17:27 -04:00
										 |  |  |     [ a' ] build-tree analyze-recursive | 
					
						
							| 
									
										
										
										
											2008-08-10 02:58:39 -04:00
										 |  |  |     \ a' label-is-loop? | 
					
						
							|  |  |  | ] unit-test | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [ f ] [ | 
					
						
							| 
									
										
										
										
											2008-09-12 06:17:27 -04:00
										 |  |  |     [ b' ] build-tree analyze-recursive | 
					
						
							| 
									
										
										
										
											2008-08-10 02:58:39 -04:00
										 |  |  |     \ b' label-is-loop? | 
					
						
							|  |  |  | ] unit-test | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ! I used to think this should be f, but doing this on pen and | 
					
						
							|  |  |  | ! paper almost convinced me that a loop conversion here is | 
					
						
							|  |  |  | ! sound. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [ t ] [ | 
					
						
							| 
									
										
										
										
											2008-09-12 06:17:27 -04:00
										 |  |  |     [ b' ] build-tree analyze-recursive | 
					
						
							| 
									
										
										
										
											2008-08-10 02:58:39 -04:00
										 |  |  |     \ a' label-is-loop? | 
					
						
							|  |  |  | ] unit-test | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [ f ] [ | 
					
						
							| 
									
										
										
										
											2008-09-12 06:17:27 -04:00
										 |  |  |     [ a' ] build-tree analyze-recursive | 
					
						
							| 
									
										
										
										
											2008-08-10 02:58:39 -04:00
										 |  |  |     \ b' label-is-loop? | 
					
						
							|  |  |  | ] unit-test | 
					
						
							| 
									
										
										
										
											2008-10-02 02:17:45 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | DEFER: a'' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : b'' ( -- )
 | 
					
						
							|  |  |  |     a'' ; inline recursive
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : a'' ( -- )
 | 
					
						
							|  |  |  |     b'' a'' ; inline recursive
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [ t ] [ | 
					
						
							|  |  |  |     [ a'' ] build-tree analyze-recursive | 
					
						
							|  |  |  |     \ a'' label-is-not-loop? | 
					
						
							|  |  |  | ] unit-test | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : loop-in-non-loop ( x quot: ( i -- ) -- )
 | 
					
						
							|  |  |  |     over 0 > [ | 
					
						
							|  |  |  |         [ [ 1 - ] dip loop-in-non-loop ] [ call ] 2bi
 | 
					
						
							|  |  |  |     ] [ 2drop ] if ; inline recursive
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [ t ] [ | 
					
						
							|  |  |  |     [ 10 [ [ drop ] each-integer ] loop-in-non-loop ] | 
					
						
							|  |  |  |     build-tree analyze-recursive | 
					
						
							|  |  |  |     \ (each-integer) label-is-loop? | 
					
						
							|  |  |  | ] unit-test |