aboutsummaryrefslogtreecommitdiff
path: root/src/interp
diff options
context:
space:
mode:
Diffstat (limited to 'src/interp')
-rw-r--r--src/interp/g-util.boot11
1 files changed, 11 insertions, 0 deletions
diff --git a/src/interp/g-util.boot b/src/interp/g-util.boot
index 236076c0..f4f8ba00 100644
--- a/src/interp/g-util.boot
+++ b/src/interp/g-util.boot
@@ -68,6 +68,13 @@ mkBind(inits,expr) ==
mkBind([:inits,:inits'],expr')
['%bind,inits,expr]
+splitAssignments u == main(u,nil) where
+ main(u,l) ==
+ u is ['%LET,x,v] =>
+ v is ['%LET,y,.] => main(v,[['%LET,x,y],:l])
+ [u,:l]
+ nil
+
++ We have a list `l' of expressions to be executed sequentially.
++ Splice in any directly-embedded sequence of expressions.
++ NOTES: This function should not be called on any program with
@@ -79,6 +86,10 @@ spliceSeqArgs l ==
stmts = nil => spliceSeqArgs rest l
lastNode(stmts).rest := spliceSeqArgs rest l
stmts
+ s := first l
+ s is ['%LET,x,y] and (stmts := splitAssignments y) =>
+ lastNode(stmts).rest := [['%LET,x,second y],:spliceSeqArgs rest l]
+ stmts
rest l = nil => l
l.rest := spliceSeqArgs rest l
l