aboutsummaryrefslogtreecommitdiff
path: root/src/interp
diff options
context:
space:
mode:
Diffstat (limited to 'src/interp')
-rw-r--r--src/interp/compiler.boot5
-rw-r--r--src/interp/g-opt.boot8
-rw-r--r--src/interp/g-util.boot2
-rw-r--r--src/interp/lisp-backend.boot2
-rw-r--r--src/interp/nruncomp.boot3
5 files changed, 10 insertions, 10 deletions
diff --git a/src/interp/compiler.boot b/src/interp/compiler.boot
index 0254f3db..dea05b3d 100644
--- a/src/interp/compiler.boot
+++ b/src/interp/compiler.boot
@@ -1379,7 +1379,7 @@ compIf(["IF",a,b,c],m,E) ==
canReturn(expr,level,exitCount,ValueFlag) == --SPAD: exit and friends
expr isnt [.,:.] => ValueFlag and level=exitCount
op := expr.op
- op in '(QUOTE CLOSEDFN) => ValueFlag and level=exitCount
+ op in '(QUOTE CLOSEDFN %lambda) => ValueFlag and level=exitCount
op is "TAGGEDexit" =>
expr is [.,count,data] => canReturn(data.expr,level,count,count=level)
level=exitCount and not ValueFlag => nil
@@ -2684,8 +2684,7 @@ compUnnamedMapping(parms,source,target,body,env) ==
[.,.,env] := compMakeDeclaration(p,s,env)
env := giveVariableSomeValue(p,get(p,'mode,env),env)
T := comp(body,target,env) or return nil
- [.,fun] := optimizeFunctionDef [nil,["LAMBDA",parms,T.expr]]
- fun := finishLambdaExpression(fun,env)
+ fun := ['%closure,['%lambda,[:parms,'$],T.expr],'$]
[fun,["Mapping",T.mode,:source],savedEnv]
gatherParameterList vars == main(vars,nil,nil) where
diff --git a/src/interp/g-opt.boot b/src/interp/g-opt.boot
index a859c67a..c92e326e 100644
--- a/src/interp/g-opt.boot
+++ b/src/interp/g-opt.boot
@@ -95,7 +95,7 @@ changeVariableDefinitionToStore(form,vars) ==
changeVariableDefinitionToStore(third form,vars')
vars
abstractionOperator? form.op =>
- changeVariableDefinitionToStore(third form,[:second form,:vars])
+ changeVariableDefinitionToStore(form.absBody,[:form.absParms,:vars])
vars
for x in form repeat
vars := changeVariableDefinitionToStore(x,vars)
@@ -180,8 +180,8 @@ simplifyVMForm x ==
atomic? x => x
x.op is 'CLOSEDFN => x
x.op isnt [.,:.] =>
- x is [op,vars,body] and abstractionOperator? op =>
- third(x) := simplifyVMForm body
+ symbol? x.op and abstractionOperator? x.op =>
+ x.absBody := simplifyVMForm x.absBody
x
if x.op is 'IF then
resetTo(x,optIF2COND x)
@@ -455,7 +455,7 @@ $VMsideEffectFreeOperators ==
%bitveccopy %bitvecconc %bitveclength %bitvecref %bitveceq %bitveclt
%before? %equal %sptreq %ident? %property %tref
%writeString %writeNewline %writeLine
- %void %retract %pullback)
+ %void %retract %pullback %lambda %closure)
++ List of simple VM operators
$simpleVMoperators ==
diff --git a/src/interp/g-util.boot b/src/interp/g-util.boot
index d826627c..18ada7f8 100644
--- a/src/interp/g-util.boot
+++ b/src/interp/g-util.boot
@@ -86,7 +86,7 @@ macro builtinConstructor? s ==
--%
$AbstractionOperator ==
- '(LAM ILAM SLAM XLAM SPADSLAM LAMBDA)
+ '(LAM ILAM SLAM XLAM SPADSLAM LAMBDA %lambda)
++ Return true if the symbol 's' is used in the form 'x'.
usedSymbol?(s,x) ==
diff --git a/src/interp/lisp-backend.boot b/src/interp/lisp-backend.boot
index 17efec64..3b41d361 100644
--- a/src/interp/lisp-backend.boot
+++ b/src/interp/lisp-backend.boot
@@ -629,8 +629,10 @@ for x in [
['%lam, :'LAMBDA],
['%leave, :'RETURN],
['%otherwise,:'T],
+ ['%closure, :'CONS],
['%funcall, :'FUNCALL],
['%function, :'FUNCTION],
+ ['%lambda, :'LAMBDA],
['%when, :'COND],
-- I/O stream functions
diff --git a/src/interp/nruncomp.boot b/src/interp/nruncomp.boot
index 2fe210e9..29a36988 100644
--- a/src/interp/nruncomp.boot
+++ b/src/interp/nruncomp.boot
@@ -666,8 +666,7 @@ NRTputInHead(db,bod) ==
bod is ['%when,:clauses] =>
for cc in clauses repeat NRTputInTail(db,cc)
bod
- bod is ['QUOTE,:.] => bod
- bod is ["CLOSEDFN",:.] => bod
+ bod.op in '(QUOTE CLOSEDFN) => bod
NRTputInHead(db,first bod)
NRTputInTail(db,rest bod)
bod