aboutsummaryrefslogtreecommitdiff
path: root/src/interp/g-util.boot
diff options
context:
space:
mode:
Diffstat (limited to 'src/interp/g-util.boot')
-rw-r--r--src/interp/g-util.boot12
1 files changed, 9 insertions, 3 deletions
diff --git a/src/interp/g-util.boot b/src/interp/g-util.boot
index ac31d47e..e6926643 100644
--- a/src/interp/g-util.boot
+++ b/src/interp/g-util.boot
@@ -200,7 +200,7 @@ expandLoop(iters,body,ret) ==
if bodyInits ~= nil then
body := ["LET",bodyInits,body]
exits := ["COND",
- [mkpf(exits,"OR"),["RETURN",ret]],
+ [mkpf(exits,"OR"),["RETURN",expandToVMForm ret]],
[true,body]]
body := ["LOOP",exits,:cont]
-- Finally, set up loop-wide initializations.
@@ -221,6 +221,9 @@ expandCollect ["%collect",:iters,body] ==
expandRepeat ["%repeat",:iters,body] ==
expandLoop(iters,body,["voidValue"])
+expandReduce ['%reduce,:iters,val,body] ==
+ expandLoop(iters,body,val)
+
expandReturn(x is ['%return,.,y]) ==
$FUNNAME = nil => systemErrorHere ['expandReturn,x]
['RETURN_-FROM,$FUNNAME,expandToVMForm y]
@@ -334,14 +337,17 @@ for x in [
['%string?, :'STRINGP],
-- general utility
- ['%hash,:'SXHASH],
- ['%lam, :'LAMBDA]
+ ['%hash, :'SXHASH],
+ ['%lam, :'LAMBDA],
+ ['%otherwise,:'T],
+ ['%when, :'COND]
] repeat property(first x,'%Rename) := rest x
++ Table of opcode-expander pairs.
for x in [
["%collect",:function expandCollect],
["%repeat",:function expandRepeat],
+ ['%reduce, :function expandReduce],
['%return, :function expandReturn],
["%eq",:function expandEq],