aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authordos-reis <gdr@axiomatics.org>2011-12-04 18:46:05 +0000
committerdos-reis <gdr@axiomatics.org>2011-12-04 18:46:05 +0000
commita92d137e0a0de4abb7d680608b32e83b1b92ed9f (patch)
tree6006158f98faba33a2333f4107f72ed33ee6f2b2 /src
parent25235d1ab4b8841e10e62414cea75294055375f9 (diff)
downloadopen-axiom-a92d137e0a0de4abb7d680608b32e83b1b92ed9f.tar.gz
* interp/compiler.boot (freeVarUsage): Handle %bind and LET.
Diffstat (limited to 'src')
-rw-r--r--src/ChangeLog4
-rw-r--r--src/interp/compiler.boot15
2 files changed, 17 insertions, 2 deletions
diff --git a/src/ChangeLog b/src/ChangeLog
index d9594223..4597a6f3 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,5 +1,9 @@
2011-12-04 Gabriel Dos Reis <gdr@cs.tamu.edu>
+ * interp/compiler.boot (freeVarUsage): Handle %bind and LET.
+
+2011-12-04 Gabriel Dos Reis <gdr@cs.tamu.edu>
+
* interp/g-util.boot (splitAssignments): New.
(spliceSeqArgs): Use it.
diff --git a/src/interp/compiler.boot b/src/interp/compiler.boot
index 04807d73..b9788096 100644
--- a/src/interp/compiler.boot
+++ b/src/interp/compiler.boot
@@ -266,8 +266,8 @@ freeVarUsage([.,vars,body],env) ==
[[u,:1],:free]
op := u.op
op in '(QUOTE GO function) => free
- op = "LAMBDA" =>
- bound := setUnion(bound, second u)
+ op in '(LAMBDA %lambda) =>
+ bound := setUnion(u.absParms,bound)
for v in CDDR u repeat
free := freeList(v,bound,free,e)
free
@@ -276,6 +276,17 @@ freeVarUsage([.,vars,body],env) ==
for v in CDDR u | cons? v repeat
free := freeList(v,bound,free,e)
free
+ op = '%bind =>
+ for [v,init] in second u repeat
+ bound := [v,:bound]
+ free := freeList(init,bound,free,e)
+ freeList(third u,bound,free,e)
+ op = 'LET =>
+ locals := nil
+ for [v,init] in second u repeat
+ free := freeList(init,bound,free,e)
+ locals := [v,:locals]
+ freeList(third u,setUnion(locals,bound),free,e)
op = '%seq =>
for v in rest u | cons? v repeat
free := freeList(v,bound,free,e)