Working on evaluation of arguments in lisp
parent
aec57446ab
commit
f9676666bd
|
@ -24,10 +24,10 @@ M: no-such-var summary drop "No such variable" ;
|
||||||
[ ] [ convert-form compose ] foldl ; inline
|
[ ] [ convert-form compose ] foldl ; inline
|
||||||
|
|
||||||
: convert-begin ( cons -- quot )
|
: convert-begin ( cons -- quot )
|
||||||
cdr [ convert-form ] [ ] lmap-as '[ , [ funcall ] each ] ;
|
cdr [ convert-form ] [ ] lmap-as '[ , [ call ] each ] ;
|
||||||
|
|
||||||
: convert-cond ( cons -- quot )
|
: convert-cond ( cons -- quot )
|
||||||
cdr [ 2car [ convert-form ] bi@ [ '[ @ funcall ] ] dip 2array ]
|
cdr [ 2car [ convert-form ] bi@ [ '[ @ call ] ] dip 2array ]
|
||||||
{ } lmap-as '[ , cond ] ;
|
{ } lmap-as '[ , cond ] ;
|
||||||
|
|
||||||
: convert-general-form ( cons -- quot )
|
: convert-general-form ( cons -- quot )
|
||||||
|
@ -36,35 +36,33 @@ M: no-such-var summary drop "No such variable" ;
|
||||||
! words for convert-lambda
|
! words for convert-lambda
|
||||||
<PRIVATE
|
<PRIVATE
|
||||||
: localize-body ( assoc body -- assoc newbody )
|
: localize-body ( assoc body -- assoc newbody )
|
||||||
[ lisp-symbol? ] pick '[ [ name>> , at ] [ ] bi or ] traverse ;
|
{
|
||||||
|
{ [ dup list? ] [ [ lisp-symbol? ] pick '[ [ name>> , at ] [ ] bi or ] traverse ] }
|
||||||
|
{ [ dup lisp-symbol? ] [ name>> over at ] }
|
||||||
|
[ ]
|
||||||
|
} cond ;
|
||||||
|
|
||||||
: localize-lambda ( body vars -- newbody newvars )
|
: localize-lambda ( body vars -- newvars newbody )
|
||||||
tuck make-locals dup push-locals swap
|
make-locals dup push-locals swap
|
||||||
[ swap localize-body swapd convert-form nip swap pop-locals ] dip swap ;
|
[ swap localize-body convert-form swap pop-locals ] dip swap ;
|
||||||
|
|
||||||
: split-lambda ( cons -- body-cons vars-seq )
|
: split-lambda ( cons -- body-cons vars-seq )
|
||||||
3car -rot nip [ name>> ] lmap>array ; inline
|
cdr uncons [ car ] [ [ name>> ] lmap>array ] bi* ; inline
|
||||||
|
|
||||||
: rest-lambda ( body vars -- quot )
|
: rest-lambda ( body vars -- quot )
|
||||||
"&rest" swap [ index ] [ remove ] 2bi
|
"&rest" swap [ index ] [ remove ] 2bi
|
||||||
swapd localize-lambda <lambda>
|
swapd localize-lambda <lambda>
|
||||||
'[ , cut '[ @ , ] , compose ] ;
|
'[ , cut '[ @ , seq>list ] call , call ] ;
|
||||||
|
|
||||||
: normal-lambda ( body vars -- quot )
|
: normal-lambda ( body vars -- quot )
|
||||||
localize-lambda <lambda> '[ , compose ] ;
|
localize-lambda <lambda> lambda-rewrite [ compose call ] compose 1quotation ;
|
||||||
PRIVATE>
|
PRIVATE>
|
||||||
|
|
||||||
: convert-lambda ( cons -- quot )
|
: convert-lambda ( cons -- quot )
|
||||||
split-lambda "&rest" over member? [ rest-lambda ] [ normal-lambda ] if ;
|
split-lambda "&rest" over member? [ rest-lambda ] [ normal-lambda ] if ;
|
||||||
|
|
||||||
: convert-quoted ( cons -- quot )
|
: convert-quoted ( cons -- quot )
|
||||||
cdr 1quotation ;
|
cadr 1quotation ;
|
||||||
|
|
||||||
: convert-unquoted ( cons -- quot )
|
|
||||||
"unquote not valid outside of quasiquote!" throw ;
|
|
||||||
|
|
||||||
: convert-unquoted-splicing ( cons -- quot )
|
|
||||||
"unquote-splicing not valid outside of quasiquote!" throw ;
|
|
||||||
|
|
||||||
: convert-defmacro ( cons -- quot )
|
: convert-defmacro ( cons -- quot )
|
||||||
cdr [ car ] keep [ convert-lambda ] [ car name>> ] bi define-lisp-macro 1quotation ;
|
cdr [ car ] keep [ convert-lambda ] [ car name>> ] bi define-lisp-macro 1quotation ;
|
||||||
|
@ -74,9 +72,6 @@ PRIVATE>
|
||||||
{ { "lambda" [ convert-lambda ] }
|
{ { "lambda" [ convert-lambda ] }
|
||||||
{ "defmacro" [ convert-defmacro ] }
|
{ "defmacro" [ convert-defmacro ] }
|
||||||
{ "quote" [ convert-quoted ] }
|
{ "quote" [ convert-quoted ] }
|
||||||
{ "unquote" [ convert-unquoted ] }
|
|
||||||
{ "unquote-splicing" [ convert-unquoted-splicing ] }
|
|
||||||
{ "quasiquote" [ convert-quasiquoted ] }
|
|
||||||
{ "begin" [ convert-begin ] }
|
{ "begin" [ convert-begin ] }
|
||||||
{ "cond" [ convert-cond ] }
|
{ "cond" [ convert-cond ] }
|
||||||
[ drop convert-general-form ]
|
[ drop convert-general-form ]
|
||||||
|
@ -92,6 +87,7 @@ PRIVATE>
|
||||||
: convert-form ( lisp-form -- quot )
|
: convert-form ( lisp-form -- quot )
|
||||||
{
|
{
|
||||||
{ [ dup cons? ] [ convert-list-form ] }
|
{ [ dup cons? ] [ convert-list-form ] }
|
||||||
|
{ [ dup lisp-var? ] [ lookup-var 1quotation ] }
|
||||||
{ [ dup lisp-symbol? ] [ '[ , lookup-var ] ] }
|
{ [ dup lisp-symbol? ] [ '[ , lookup-var ] ] }
|
||||||
[ 1quotation ]
|
[ 1quotation ]
|
||||||
} cond ;
|
} cond ;
|
||||||
|
@ -120,20 +116,27 @@ SYMBOL: macro-env
|
||||||
: lisp-define ( quot name -- )
|
: lisp-define ( quot name -- )
|
||||||
lisp-env get set-at ;
|
lisp-env get set-at ;
|
||||||
|
|
||||||
|
: defun ( name quot -- name )
|
||||||
|
over name>> lisp-define ;
|
||||||
|
|
||||||
: lisp-get ( name -- word )
|
: lisp-get ( name -- word )
|
||||||
dup lisp-env get at [ ] [ no-such-var ] ?if ;
|
dup lisp-env get at [ ] [ no-such-var ] ?if ;
|
||||||
|
|
||||||
: lookup-var ( lisp-symbol -- quot )
|
: lookup-var ( lisp-symbol -- quot )
|
||||||
name>> lisp-get ;
|
name>> lisp-get ;
|
||||||
|
|
||||||
: lisp-var? ( lisp-symbol -- ? )
|
: lisp-var? ( lisp-symbol -- ? )
|
||||||
name>> lisp-env get key? ;
|
dup lisp-symbol? [ name>> lisp-env get key? ] [ drop f ] if ;
|
||||||
|
|
||||||
|
: funcall-arg-list ( args -- newargs )
|
||||||
|
[ ] [ dup \ funcall = [ drop 2 cut* [ funcall ] compose call ] when suffix ] reduce ;
|
||||||
|
|
||||||
: funcall ( quot sym -- * )
|
: funcall ( quot sym -- * )
|
||||||
dup lisp-symbol? [ lookup-var ] when call ; inline
|
[ funcall-arg-list ] dip
|
||||||
|
dup lisp-symbol? [ lookup-var ] when curry call ; inline
|
||||||
|
|
||||||
: define-primitive ( name vocab word -- )
|
: define-primitive ( name vocab word -- )
|
||||||
swap lookup 1quotation '[ , compose call ] swap lisp-define ;
|
swap lookup 1quotation '[ , compose call ] swap lisp-define ; ! '[ , compose call ] swap lisp-define ;
|
||||||
|
|
||||||
: lookup-macro ( lisp-symbol -- lambda )
|
: lookup-macro ( lisp-symbol -- lambda )
|
||||||
name>> macro-env get at ;
|
name>> macro-env get at ;
|
||||||
|
|
Loading…
Reference in New Issue