From 25235d1ab4b8841e10e62414cea75294055375f9 Mon Sep 17 00:00:00 2001 From: dos-reis Date: Sun, 4 Dec 2011 11:03:44 +0000 Subject: * interp/g-util.boot (splitAssignments): New. (spliceSeqArgs): Use it. --- src/interp/g-util.boot | 11 +++++++++++ 1 file changed, 11 insertions(+) (limited to 'src/interp') 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 -- cgit v1.2.3