Fixing cond, variable lookup

db4
James Cash 2008-05-18 12:53:44 -04:00
parent 1acf9bc60b
commit eddb4f4994
1 changed files with 14 additions and 11 deletions

View File

@ -7,7 +7,7 @@ IN: lisp
DEFER: convert-form DEFER: convert-form
DEFER: funcall DEFER: funcall
DEFER: lookup-vars DEFER: lookup-var
! Functions to convert s-exps to quotations ! Functions to convert s-exps to quotations
! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@ -21,10 +21,11 @@ DEFER: lookup-vars
rest convert-form ; rest convert-form ;
: convert-cond ( s-exp -- quot ) : convert-cond ( s-exp -- quot )
rest [ [ convert-form map ] map ] [ % cond ] bake ; rest [ body>> >array [ convert-form ] map first2 swap `{ [ % funcall ] , } bake ]
map >array [ , cond ] bake ;
: convert-general-form ( s-exp -- quot ) : convert-general-form ( s-exp -- quot )
unclip convert-form swap convert-body [ , lookup-vars % funcall ] bake ; unclip convert-form swap convert-body [ , % funcall ] bake ;
! words for convert-lambda ! words for convert-lambda
<PRIVATE <PRIVATE
@ -43,10 +44,10 @@ DEFER: lookup-vars
: rest-lambda ( body vars -- quot ) : rest-lambda ( body vars -- quot )
"&rest" swap [ remove ] [ index ] 2bi "&rest" swap [ remove ] [ index ] 2bi
[ localize-lambda <lambda> ] dip [ localize-lambda <lambda> ] dip
[ , lookup-vars cut swap [ % , ] bake , compose ] bake ; [ , cut swap [ % , ] bake , compose ] bake ;
: normal-lambda ( body vars -- quot ) : normal-lambda ( body vars -- quot )
localize-lambda <lambda> [ lookup-vars , compose ] bake ; localize-lambda <lambda> [ , compose ] bake ;
PRIVATE> PRIVATE>
: convert-lambda ( s-exp -- quot ) : convert-lambda ( s-exp -- quot )
@ -68,8 +69,10 @@ PRIVATE>
[ drop convert-general-form ] if ; [ drop convert-general-form ] if ;
: convert-form ( lisp-form -- quot ) : convert-form ( lisp-form -- quot )
dup s-exp? [ body>> convert-list-form ] { { [ dup s-exp? ] [ body>> convert-list-form ] }
[ [ , ] bake ] if ; { [ dup lisp-symbol? ] [ [ , lookup-var ] bake ] }
[ [ , ] bake ]
} cond ;
: lisp-string>factor ( str -- quot ) : lisp-string>factor ( str -- quot )
lisp-expr parse-result-ast convert-form lambda-rewrite call ; lisp-expr parse-result-ast convert-form lambda-rewrite call ;
@ -88,11 +91,11 @@ ERROR: no-such-var var ;
: lisp-get ( name -- word ) : lisp-get ( name -- word )
dup lisp-env get at [ ] [ no-such-var throw ] ?if ; dup lisp-env get at [ ] [ no-such-var throw ] ?if ;
: funcall ( quot sym -- * ) : lookup-var ( lisp-symbol -- quot )
dup lisp-symbol? [ name>> lisp-get ] when call ; inline name>> lisp-get ;
: lookup-vars ( q -- p ) : funcall ( quot sym -- * )
[ dup lisp-symbol? [ name>> lisp-get ] when ] map ; dup lisp-symbol? [ lookup-var ] when call ; inline
: define-primitve ( name vocab word -- ) : define-primitve ( name vocab word -- )
swap lookup [ [ , ] compose call ] bake lisp-define ; swap lookup [ [ , ] compose call ] bake lisp-define ;