165 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Factor
		
	
	
		
		
			
		
	
	
			165 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Factor
		
	
	
|  | 
 | ||
|  | USING: kernel words namespaces combinators math | ||
|  |        quotations strings arrays hashtables sequences | ||
|  |        namespaces.lib rewrite-closures ;
 | ||
|  | 
 | ||
|  | IN: lisp | ||
|  | 
 | ||
|  | ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | ||
|  | 
 | ||
|  | : && ( obj seq -- ? ) [ call ] with all? ;
 | ||
|  | 
 | ||
|  | ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | ||
|  | 
 | ||
|  | ! (quote sym) | ||
|  | 
 | ||
|  | SYMBOL: quote | ||
|  | 
 | ||
|  | : quote-exp? ( exp -- ? ) { [ array? ] [ length 2 = ] [ first quote = ] } && ;
 | ||
|  | 
 | ||
|  | : eval-quote ( exp -- val ) second ;
 | ||
|  | 
 | ||
|  | ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | ||
|  | 
 | ||
|  | : eval-symbol ( exp -- val ) get ;
 | ||
|  | 
 | ||
|  | ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | ||
|  | 
 | ||
|  | DEFER: eval | ||
|  | 
 | ||
|  | ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | ||
|  | 
 | ||
|  | ! (begin ...) | ||
|  | 
 | ||
|  | SYMBOL: begin | ||
|  | 
 | ||
|  | : begin-exp? ( exp -- ? ) { [ array? ] [ length 2 >= ] [ first begin = ] } && ;
 | ||
|  | 
 | ||
|  | : eval-begin ( exp -- val ) 1 tail dup peek >r 1 head* [ eval ] each r> eval ;
 | ||
|  | 
 | ||
|  | ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | ||
|  | 
 | ||
|  | ! (omega parameters ...) | ||
|  | 
 | ||
|  | SYMBOL: omega | ||
|  | 
 | ||
|  | : omega-exp? ( exp -- ? ) { [ array? ] [ length 3 >= ] [ first omega = ] } && ;
 | ||
|  | 
 | ||
|  | : eval-omega ( exp -- val )
 | ||
|  | dup second swap 2 tail { begin } swap append [ eval ] curry lambda ;
 | ||
|  | 
 | ||
|  | ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | ||
|  | 
 | ||
|  | ! (let ((var val) ...) exp ...) | ||
|  | 
 | ||
|  | SYMBOL: let | ||
|  | 
 | ||
|  | : let-exp? ( exp -- ? ) { [ array? ] [ length 2 >= ] [ first let = ] } && ;
 | ||
|  | 
 | ||
|  | : eval-let ( exp -- val )
 | ||
|  | dup >r second [ second ] map r> | ||
|  | dup 2 tail swap second [ first ] map add* omega add* add* eval ;
 | ||
|  | 
 | ||
|  | ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | ||
|  | 
 | ||
|  | ! (df name (param ...) exp ...) | ||
|  | 
 | ||
|  | SYMBOL: df | ||
|  | 
 | ||
|  | : df-exp? ( exp -- ? ) { [ array? ] [ length 3 >= ] [ first df = ] } && ;
 | ||
|  | 
 | ||
|  | : eval-df ( exp -- val ) dup 2 tail omega add* eval swap second tuck set ;
 | ||
|  | 
 | ||
|  | ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | ||
|  | 
 | ||
|  | ! (dv var val) | ||
|  | 
 | ||
|  | SYMBOL: dv | ||
|  | 
 | ||
|  | : dv-exp? ( exp -- ? ) { [ array? ] [ length 3 = ] [ first dv = ] } && ;
 | ||
|  | 
 | ||
|  | : eval-dv ( exp -- val ) dup >r third eval r> second set ;
 | ||
|  | 
 | ||
|  | ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | ||
|  | 
 | ||
|  | ! (set! var val) | ||
|  | 
 | ||
|  | SYMBOL: set! | ||
|  | 
 | ||
|  | : set!-exp? ( exp -- ? ) { [ array? ] [ length 3 = ] [ first set! = ] } && ;
 | ||
|  | 
 | ||
|  | : eval-set! ( exp -- val ) dup >r third eval r> second set* ;
 | ||
|  | 
 | ||
|  | ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | ||
|  | 
 | ||
|  | ! (dyn (param ...) exp ...) | ||
|  | 
 | ||
|  | SYMBOL: dyn | ||
|  | 
 | ||
|  | : dyn-exp? ( exp -- ? ) { [ array? ] [ length 3 >= ] [ first dyn = ] } && ;
 | ||
|  | 
 | ||
|  | : eval-dyn ( exp -- val )
 | ||
|  | dup second swap 2 tail begin add* [ eval ] curry parametric-quot scoped-quot ;
 | ||
|  | 
 | ||
|  | ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | ||
|  | 
 | ||
|  | ! (dy name (param ...) exp ...) | ||
|  | 
 | ||
|  | SYMBOL: dy | ||
|  | 
 | ||
|  | : dy-exp? ( exp -- ? ) { [ array? ] [ length 3 >= ] [ first dy = ] } && ;
 | ||
|  | 
 | ||
|  | : eval-dy ( exp -- val ) dup 2 tail dyn add* eval swap second tuck set ;
 | ||
|  | 
 | ||
|  | ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | ||
|  | 
 | ||
|  | ! : eval-list ( exp -- val ) | ||
|  | ! [ eval ] map unclip >r [ ] each r> | ||
|  | ! { { [ dup quotation? ] [ call ] } | ||
|  | !   { [ dup word? ]      [ execute ] } } | ||
|  | ! cond ; | ||
|  | 
 | ||
|  | : eval-list ( exp -- val )
 | ||
|  | unclip eval >r [ eval ] each r> | ||
|  | { { [ dup quotation? ] [ call ] } | ||
|  |   { [ dup word? ]      [ execute ] } } | ||
|  | cond ;
 | ||
|  | 
 | ||
|  | ! should probably be: | ||
|  | 
 | ||
|  | ! : eval-list ( exp -- val ) | ||
|  | ! unclip >r [ eval ] each r> eval | ||
|  | ! { { [ dup quotation? ] [ call ] } | ||
|  | !   { [ dup word? ]      [ execute ] } } | ||
|  | ! cond ; | ||
|  | 
 | ||
|  | ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | ||
|  | 
 | ||
|  | : eval ( exp -- val )
 | ||
|  | { { [ dup t eq? ]   [ ] } | ||
|  |   { [ dup f eq? ]   [ ] } | ||
|  |   { [ dup number? ] [ ] } | ||
|  |   { [ dup string? ] [ ] } | ||
|  |   { [ dup quotation? ] [ ] } | ||
|  |   { [ dup hashtable? ] [ ] } | ||
|  |   { [ dup quote-exp? ] [ eval-quote ] } | ||
|  |   { [ dup begin-exp? ] [ eval-begin ] } | ||
|  |   { [ dup omega-exp? ] [ eval-omega ] } | ||
|  |   { [ dup let-exp? ]   [ eval-let ] } | ||
|  |   { [ dup df-exp? ]    [ eval-df ] } | ||
|  |   { [ dup dv-exp? ]    [ eval-dv ] } | ||
|  |   { [ dup set!-exp? ]  [ eval-set! ] } | ||
|  |   { [ dup dyn-exp? ]   [ eval-dyn ] } | ||
|  |   { [ dup dy-exp? ]   [ eval-dy ] } | ||
|  |   { [ dup symbol? ] [ eval-symbol ] } | ||
|  |   { [ dup word? ] [ ] } | ||
|  |   { [ dup array? ]  [ eval-list ] } | ||
|  | } cond ;
 | ||
|  | 
 | ||
|  | ! : eval-quot-call ( exp -- val ) [ eval ] map unclip >r [ ] each r> call ; | ||
|  | 
 | ||
|  | ! : eval-word-call ( exp -- val ) [ eval ] map unclip >r [ ] each r> execute ; | ||
|  | 
 | ||
|  | ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | ||
|  | 
 |