| 
									
										
										
										
											2010-02-17 09:56:41 -05:00
										 |  |  | USING: classes.struct classes.tuple functors tools.test math | 
					
						
							|  |  |  | words kernel multiline parser io.streams.string generic ;
 | 
					
						
							| 
									
										
										
										
											2009-09-15 22:43:18 -04:00
										 |  |  | QUALIFIED-WITH: alien.c-types c | 
					
						
							| 
									
										
										
										
											2009-08-13 20:21:44 -04:00
										 |  |  | IN: functors.tests | 
					
						
							| 
									
										
										
										
											2008-11-14 21:18:16 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | << | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | FUNCTOR: define-box ( T -- )
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-06 03:45:21 -05:00
										 |  |  | B DEFINES-CLASS ${T}-box | 
					
						
							| 
									
										
										
										
											2008-11-14 21:18:16 -05:00
										 |  |  | <B> DEFINES <${B}> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | WHERE | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | TUPLE: B { value T } ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-21 04:17:35 -04:00
										 |  |  | C: <B> B ( T -- B )
 | 
					
						
							| 
									
										
										
										
											2008-11-14 21:18:16 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | ;FUNCTOR | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | \ float define-box | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | >> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | { 1 0 } [ define-box ] must-infer-as | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [ T{ float-box f 5.0 } ] [ 5.0 <float-box> ] unit-test | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : twice ( word -- )
 | 
					
						
							|  |  |  |     [ execute ] [ execute ] bi ; inline
 | 
					
						
							|  |  |  | << | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | FUNCTOR: wrapper-test ( W -- )
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | WW DEFINES ${W}${W} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | WHERE | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-17 09:56:41 -05:00
										 |  |  | : WW ( a -- b ) \ W twice ;
 | 
					
						
							| 
									
										
										
										
											2008-11-14 21:18:16 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | ;FUNCTOR | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | \ sq wrapper-test | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | >> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [ 16 ] [ 2 sqsq ] unit-test | 
					
						
							| 
									
										
										
										
											2009-01-28 18:07:31 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | << | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | FUNCTOR: wrapper-test-2 ( W -- )
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | W DEFINES ${W} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | WHERE | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : W ( a b -- c ) \ + execute ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ;FUNCTOR | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | "blah" wrapper-test-2 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | >> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-06 03:45:21 -05:00
										 |  |  | [ 4 ] [ 1 3 blah ] unit-test | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-27 15:02:14 -04:00
										 |  |  | << | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | FUNCTOR: symbol-test ( W -- )
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | W DEFINES ${W} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | WHERE | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | SYMBOL: W | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ;FUNCTOR | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | "blorgh" symbol-test | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | >> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [ blorgh ] [ blorgh ] unit-test | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-01 17:16:40 -04:00
										 |  |  | << | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | FUNCTOR: generic-test ( W -- )
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | W DEFINES ${W} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | WHERE | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | GENERIC: W ( a -- b )
 | 
					
						
							|  |  |  | M: object W ;
 | 
					
						
							|  |  |  | M: integer W 1 + ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ;FUNCTOR | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | "snurv" generic-test | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | >> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [ 2   ] [ 1   snurv ] unit-test | 
					
						
							|  |  |  | [ 3.0 ] [ 3.0 snurv ] unit-test | 
					
						
							| 
									
										
										
										
											2009-02-06 03:45:21 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | ! Does replacing an ordinary word with a functor-generated one work? | 
					
						
							|  |  |  | [ [ ] ] [ | 
					
						
							| 
									
										
										
										
											2009-09-20 23:42:40 -04:00
										 |  |  |     "IN: functors.tests | 
					
						
							| 
									
										
										
										
											2009-02-06 03:45:21 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     TUPLE: some-tuple ;
 | 
					
						
							|  |  |  |     : some-word ( -- ) ;
 | 
					
						
							| 
									
										
										
										
											2009-05-01 17:16:40 -04:00
										 |  |  |     GENERIC: some-generic ( a -- b )
 | 
					
						
							| 
									
										
										
										
											2009-02-06 03:45:21 -05:00
										 |  |  |     M: some-tuple some-generic ;
 | 
					
						
							| 
									
										
										
										
											2009-09-20 23:42:40 -04:00
										 |  |  |     SYMBOL: some-symbol" <string-reader> "functors-test" parse-stream | 
					
						
							| 
									
										
										
										
											2009-02-06 03:45:21 -05:00
										 |  |  | ] unit-test | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : test-redefinition ( -- )
 | 
					
						
							|  |  |  |     [ t ] [ "some-word" "functors.tests" lookup >boolean ] unit-test | 
					
						
							|  |  |  |     [ t ] [ "some-tuple" "functors.tests" lookup >boolean ] unit-test | 
					
						
							| 
									
										
										
										
											2009-05-01 17:16:40 -04:00
										 |  |  |     [ t ] [ "some-generic" "functors.tests" lookup >boolean ] unit-test | 
					
						
							| 
									
										
										
										
											2009-02-06 03:45:21 -05:00
										 |  |  |     [ t ] [ | 
					
						
							|  |  |  |         "some-tuple" "functors.tests" lookup | 
					
						
							|  |  |  |         "some-generic" "functors.tests" lookup method >boolean
 | 
					
						
							|  |  |  |     ] unit-test ;
 | 
					
						
							| 
									
										
										
										
											2009-04-27 15:02:14 -04:00
										 |  |  |     [ t ] [ "some-symbol" "functors.tests" lookup >boolean ] unit-test | 
					
						
							| 
									
										
										
										
											2009-02-06 03:45:21 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | test-redefinition | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | FUNCTOR: redefine-test ( W -- )
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | W-word DEFINES ${W}-word | 
					
						
							|  |  |  | W-tuple DEFINES-CLASS ${W}-tuple | 
					
						
							| 
									
										
										
										
											2009-05-01 17:16:40 -04:00
										 |  |  | W-generic DEFINES ${W}-generic | 
					
						
							| 
									
										
										
										
											2009-04-27 15:02:14 -04:00
										 |  |  | W-symbol DEFINES ${W}-symbol | 
					
						
							| 
									
										
										
										
											2009-02-06 03:45:21 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | WHERE | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | TUPLE: W-tuple ;
 | 
					
						
							|  |  |  | : W-word ( -- ) ;
 | 
					
						
							| 
									
										
										
										
											2009-05-01 17:16:40 -04:00
										 |  |  | GENERIC: W-generic ( a -- b )
 | 
					
						
							| 
									
										
										
										
											2009-02-06 03:45:21 -05:00
										 |  |  | M: W-tuple W-generic ;
 | 
					
						
							| 
									
										
										
										
											2009-04-27 15:02:14 -04:00
										 |  |  | SYMBOL: W-symbol | 
					
						
							| 
									
										
										
										
											2009-02-06 03:45:21 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | ;FUNCTOR | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [ [ ] ] [ | 
					
						
							| 
									
										
										
										
											2009-09-20 23:42:40 -04:00
										 |  |  |     """IN: functors.tests | 
					
						
							|  |  |  |     << "some" redefine-test >>""" <string-reader> "functors-test" parse-stream | 
					
						
							| 
									
										
										
										
											2009-02-06 03:45:21 -05:00
										 |  |  | ] unit-test | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-27 15:02:14 -04:00
										 |  |  | test-redefinition | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-29 20:56:42 -04:00
										 |  |  | << | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | FUNCTOR: define-a-struct ( T NAME TYPE N -- )
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | T-class DEFINES-CLASS ${T} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | WHERE | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | STRUCT: T-class | 
					
						
							| 
									
										
										
										
											2009-09-16 16:41:38 -04:00
										 |  |  |     { NAME c:int } | 
					
						
							| 
									
										
										
										
											2009-08-29 21:19:47 -04:00
										 |  |  |     { x { TYPE 4 } } | 
					
						
							| 
									
										
										
										
											2009-09-16 16:41:38 -04:00
										 |  |  |     { y { c:short N } } | 
					
						
							| 
									
										
										
										
											2009-08-29 21:19:47 -04:00
										 |  |  |     { z TYPE initial: 5 } | 
					
						
							| 
									
										
										
										
											2009-09-15 22:43:18 -04:00
										 |  |  |     { float { c:float 2 } } ;
 | 
					
						
							| 
									
										
										
										
											2009-08-29 20:56:42 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | ;FUNCTOR | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-16 16:41:38 -04:00
										 |  |  | "a-struct" "nemo" c:char 2 define-a-struct | 
					
						
							| 
									
										
										
										
											2009-08-29 20:56:42 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | >> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [ | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         T{ struct-slot-spec | 
					
						
							|  |  |  |             { name "nemo" } | 
					
						
							|  |  |  |             { offset 0 } | 
					
						
							|  |  |  |             { class integer } | 
					
						
							|  |  |  |             { initial 0 }  | 
					
						
							| 
									
										
										
										
											2009-09-16 16:41:38 -04:00
										 |  |  |             { type c:int } | 
					
						
							| 
									
										
										
										
											2009-08-29 20:56:42 -04:00
										 |  |  |         } | 
					
						
							|  |  |  |         T{ struct-slot-spec | 
					
						
							|  |  |  |             { name "x" } | 
					
						
							|  |  |  |             { offset 4 } | 
					
						
							|  |  |  |             { class object } | 
					
						
							|  |  |  |             { initial f }  | 
					
						
							| 
									
										
										
										
											2009-09-16 16:41:38 -04:00
										 |  |  |             { type { c:char 4 } } | 
					
						
							| 
									
										
										
										
											2009-08-29 20:56:42 -04:00
										 |  |  |         } | 
					
						
							|  |  |  |         T{ struct-slot-spec | 
					
						
							|  |  |  |             { name "y" } | 
					
						
							|  |  |  |             { offset 8 } | 
					
						
							|  |  |  |             { class object } | 
					
						
							|  |  |  |             { initial f }  | 
					
						
							| 
									
										
										
										
											2009-09-16 16:41:38 -04:00
										 |  |  |             { type { c:short 2 } } | 
					
						
							| 
									
										
										
										
											2009-08-29 20:56:42 -04:00
										 |  |  |         } | 
					
						
							|  |  |  |         T{ struct-slot-spec | 
					
						
							|  |  |  |             { name "z" } | 
					
						
							|  |  |  |             { offset 12 } | 
					
						
							|  |  |  |             { class fixnum } | 
					
						
							|  |  |  |             { initial 5 }  | 
					
						
							| 
									
										
										
										
											2009-09-16 16:41:38 -04:00
										 |  |  |             { type c:char } | 
					
						
							| 
									
										
										
										
											2009-08-29 20:56:42 -04:00
										 |  |  |         } | 
					
						
							|  |  |  |         T{ struct-slot-spec | 
					
						
							| 
									
										
										
										
											2009-08-29 21:19:47 -04:00
										 |  |  |             { name "float" } | 
					
						
							| 
									
										
										
										
											2009-08-29 20:56:42 -04:00
										 |  |  |             { offset 16 } | 
					
						
							|  |  |  |             { class object } | 
					
						
							|  |  |  |             { initial f }  | 
					
						
							| 
									
										
										
										
											2009-09-16 16:41:38 -04:00
										 |  |  |             { type { c:float 2 } } | 
					
						
							| 
									
										
										
										
											2009-08-29 20:56:42 -04:00
										 |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | ] [ a-struct struct-slots ] unit-test | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-17 09:56:41 -05:00
										 |  |  | << | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | FUNCTOR: define-an-inline-word ( W -- )
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | W DEFINES ${W} | 
					
						
							|  |  |  | W-W DEFINES ${W}-${W} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | WHERE | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : W ( -- ) ; inline
 | 
					
						
							|  |  |  | : W-W ( -- ) W W ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ;FUNCTOR | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | "an-inline-word" define-an-inline-word | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | >> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [ t ] [ \ an-inline-word inline? ] unit-test | 
					
						
							|  |  |  | [ f ] [ \ an-inline-word-an-inline-word inline? ] unit-test | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | << | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | FUNCTOR: define-a-final-class ( T W -- )
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | T DEFINES-CLASS ${T} | 
					
						
							|  |  |  | W DEFINES ${W} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | WHERE | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | TUPLE: T ; final
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : W ( -- ) ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ;FUNCTOR | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | "a-final-tuple" "a-word" define-a-final-class | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | >> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [ t ] [ a-final-tuple final-class? ] unit-test |