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 ] curry* 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 ;
|
|
|
|
! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
|