aboutsummaryrefslogtreecommitdiff
path: root/src/interp/lisp-backend.boot
diff options
context:
space:
mode:
authordos-reis <gdr@axiomatics.org>2012-05-02 00:46:48 +0000
committerdos-reis <gdr@axiomatics.org>2012-05-02 00:46:48 +0000
commit3a2f1fd5c85ba93860d6a7d205bcea2994374ecc (patch)
tree5c4c6962bc7657003d7b944fa2f2d6144f68cdef /src/interp/lisp-backend.boot
parent712a3ca8b06f843b15df22a4b42f677685b3b9d9 (diff)
downloadopen-axiom-3a2f1fd5c85ba93860d6a7d205bcea2994374ecc.tar.gz
* interp/vmlisp.lisp (COMPILE1): Move to lisp-backend.boot.
($lamName): Rename from *LAM-NAME*.
Diffstat (limited to 'src/interp/lisp-backend.boot')
-rw-r--r--src/interp/lisp-backend.boot30
1 files changed, 30 insertions, 0 deletions
diff --git a/src/interp/lisp-backend.boot b/src/interp/lisp-backend.boot
index 79677e07..2b739af8 100644
--- a/src/interp/lisp-backend.boot
+++ b/src/interp/lisp-backend.boot
@@ -781,3 +781,33 @@ removeFluids args ==
$Vars := [v,:$Vars]
v
[removeFluids first args,:removeFluids rest args]
+
+COMPILE1 fun ==
+ $Vars: local := nil
+ $Decls: local := nil
+ [name,lambda] := fun
+ [type,args,:body] := lambda
+ if type is 'LAM then
+ lambda := f(name,lambda) where
+ f(n,x) ==
+ $lamName: local := makeSymbol strconc(n,'",LAM")
+ EVAL x
+ [type,args,:body] := lambda
+ if body is [['DECLARE,['SPECIAL,:xs]],:body'] then
+ $Decls := xs
+ body := body'
+ args := removeFluids args
+ newArgs :=
+ type is 'LAMBDA and simpleParameterList? args => args
+ args' := gensym()
+ body := [['DSETQ,args,args'],:body]
+ type is 'LAMBDA => ["&REST",args',"&AUX",:$Vars]
+ type is 'MLAMBDA => ["&WHOLE",args',"&REST",gensym(),"&AUX",:$Vars]
+ coreError '"bad function type"
+ if $Decls ~= nil then
+ body := [['DECLARE,['SPECIAL,:$Decls]],:body]
+ body :=
+ type is 'LAMBDA => ['DEFUN,name,newArgs,:body]
+ ['DEFMACRO,name,newArgs,:body]
+ compileLispDefinition(name,body)
+ body