| 
									
										
										
										
											2008-07-12 02:08:30 -04:00
										 |  |  | ! Copyright (C) 2008 Slava Pestov. | 
					
						
							|  |  |  | ! See http://factorcode.org/license.txt for BSD license. | 
					
						
							| 
									
										
										
										
											2008-08-22 18:38:23 -04:00
										 |  |  | USING: parser words definitions kernel sequences assocs arrays | 
					
						
							|  |  |  | kernel.private fry combinators accessors vectors strings sbufs | 
					
						
							|  |  |  | byte-arrays byte-vectors io.binary io.streams.string splitting | 
					
						
							|  |  |  | math generic generic.standard generic.standard.engines ;
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | IN: hints | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-08-22 18:38:23 -04:00
										 |  |  | : (make-specializer) ( class picker -- quot )
 | 
					
						
							|  |  |  |     swap "predicate" word-prop append ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : make-specializer ( classes -- quot )
 | 
					
						
							|  |  |  |     dup length <reversed>
 | 
					
						
							|  |  |  |     [ (picker) 2array ] 2map
 | 
					
						
							|  |  |  |     [ drop object eq? not ] assoc-filter
 | 
					
						
							| 
									
										
										
										
											2008-09-06 20:13:59 -04:00
										 |  |  |     [ [ t ] ] [ | 
					
						
							| 
									
										
										
										
											2008-08-22 18:38:23 -04:00
										 |  |  |         [ (make-specializer) ] { } assoc>map
 | 
					
						
							|  |  |  |         unclip [ swap [ f ] \ if 3array append [ ] like ] reduce
 | 
					
						
							| 
									
										
										
										
											2008-09-06 20:13:59 -04:00
										 |  |  |     ] if-empty ;
 | 
					
						
							| 
									
										
										
										
											2008-08-22 18:38:23 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : specializer-cases ( quot word -- default alist )
 | 
					
						
							|  |  |  |     dup [ array? ] all? [ 1array ] unless [ | 
					
						
							|  |  |  |         [ make-specializer ] keep
 | 
					
						
							| 
									
										
										
										
											2008-09-10 23:11:40 -04:00
										 |  |  |         '[ _ declare ] pick append
 | 
					
						
							| 
									
										
										
										
											2008-08-22 18:38:23 -04:00
										 |  |  |     ] { } map>assoc ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : method-declaration ( method -- quot )
 | 
					
						
							|  |  |  |     [ "method-generic" word-prop dispatch# object <array> ] | 
					
						
							|  |  |  |     [ "method-class" word-prop ] | 
					
						
							|  |  |  |     bi prefix ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : specialize-method ( quot method -- quot' )
 | 
					
						
							| 
									
										
										
										
											2008-09-10 23:11:40 -04:00
										 |  |  |     method-declaration '[ _ declare ] prepend ;
 | 
					
						
							| 
									
										
										
										
											2008-08-22 18:38:23 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : specialize-quot ( quot specializer -- quot' )
 | 
					
						
							|  |  |  |     specializer-cases alist>quot ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : standard-method? ( method -- ? )
 | 
					
						
							|  |  |  |     dup method-body? [ | 
					
						
							|  |  |  |         "method-generic" word-prop standard-generic? | 
					
						
							|  |  |  |     ] [ drop f ] if ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : specialized-def ( word -- quot )
 | 
					
						
							|  |  |  |     dup def>> swap { | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             [ dup "specializer" word-prop ] | 
					
						
							|  |  |  |             [ "specializer" word-prop specialize-quot ] | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2008-09-13 04:12:52 -04:00
										 |  |  |         { [ dup standard-method? ] [ specialize-method ] } | 
					
						
							| 
									
										
										
										
											2008-08-22 18:38:23 -04:00
										 |  |  |         [ drop ] | 
					
						
							|  |  |  |     } cond ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : specialized-length ( specializer -- n )
 | 
					
						
							|  |  |  |     dup [ array? ] all? [ first ] when length ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-07-12 02:08:30 -04:00
										 |  |  | : HINTS: | 
					
						
							| 
									
										
										
										
											2008-09-13 04:12:52 -04:00
										 |  |  |     scan-object | 
					
						
							|  |  |  |     dup method-spec? [ first2 method ] when
 | 
					
						
							| 
									
										
										
										
											2008-08-31 02:34:00 -04:00
										 |  |  |     [ redefined ] | 
					
						
							| 
									
										
										
										
											2008-07-12 02:08:30 -04:00
										 |  |  |     [ parse-definition "specializer" set-word-prop ] bi ;
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  |     parsing | 
					
						
							| 
									
										
										
										
											2008-08-22 18:38:23 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | ! Default specializers | 
					
						
							|  |  |  | { first first2 first3 first4 } | 
					
						
							|  |  |  | [ { array } "specializer" set-word-prop ] each
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | { peek pop* pop push } [ | 
					
						
							|  |  |  |     { vector } "specializer" set-word-prop | 
					
						
							|  |  |  | ] each
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | \ push-all | 
					
						
							|  |  |  | { { string sbuf } { array vector } { byte-array byte-vector } } | 
					
						
							|  |  |  | "specializer" set-word-prop | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | \ append | 
					
						
							|  |  |  | { { string string } { array array } } | 
					
						
							|  |  |  | "specializer" set-word-prop | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | \ subseq | 
					
						
							|  |  |  | { { fixnum fixnum string } { fixnum fixnum array } } | 
					
						
							|  |  |  | "specializer" set-word-prop | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | \ reverse-here | 
					
						
							|  |  |  | { { string } { array } } | 
					
						
							|  |  |  | "specializer" set-word-prop | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | \ mismatch | 
					
						
							|  |  |  | { string string } | 
					
						
							|  |  |  | "specializer" set-word-prop | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | \ find-last-sep { string sbuf } "specializer" set-word-prop | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | \ >string { sbuf } "specializer" set-word-prop | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-09-12 09:18:44 -04:00
										 |  |  | \ >array { { vector } } "specializer" set-word-prop | 
					
						
							| 
									
										
										
										
											2008-08-22 18:38:23 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | \ >vector { { array } { vector } } "specializer" set-word-prop | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | \ >sbuf { string } "specializer" set-word-prop | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | \ split, { string string } "specializer" set-word-prop | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | \ memq? { array } "specializer" set-word-prop | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-09-12 09:18:44 -04:00
										 |  |  | \ member? { array } "specializer" set-word-prop | 
					
						
							| 
									
										
										
										
											2008-08-22 18:38:23 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | \ assoc-stack { vector } "specializer" set-word-prop | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | \ >le { { fixnum fixnum } { bignum fixnum } } "specializer" set-word-prop | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | \ >be { { bignum fixnum } { fixnum fixnum } } "specializer" set-word-prop |