diff options
-rw-r--r-- | src/ChangeLog | 5 | ||||
-rw-r--r-- | src/interp/g-util.boot | 11 |
2 files changed, 16 insertions, 0 deletions
diff --git a/src/ChangeLog b/src/ChangeLog index 1898d80a..d9594223 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,8 @@ +2011-12-04 Gabriel Dos Reis <gdr@cs.tamu.edu> + + * interp/g-util.boot (splitAssignments): New. + (spliceSeqArgs): Use it. + 2011-12-03 Gabriel Dos Reis <gdr@cs.tamu.edu> * interp/lisp-backend.boot (hasNoExit?): New. 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 |