aboutsummaryrefslogtreecommitdiff
path: root/src/boot/ast.boot
diff options
context:
space:
mode:
authordos-reis <gdr@axiomatics.org>2011-04-24 16:14:17 +0000
committerdos-reis <gdr@axiomatics.org>2011-04-24 16:14:17 +0000
commit8fc8aaeaf79472ff9cfd9b9fb3eeb17379c7d9bd (patch)
tree7ccb9ec4341eadef78f5f7c8ef0ac3c7b47d25d9 /src/boot/ast.boot
parente9dacdbd3f3cd32d38fc1dbc4545dc66ece156ea (diff)
downloadopen-axiom-8fc8aaeaf79472ff9cfd9b9fb3eeb17379c7d9bd.tar.gz
* boot/ast.boot (bfMakeCollectInsn): New.
(bfDoCollect): Tidy.
Diffstat (limited to 'src/boot/ast.boot')
-rw-r--r--src/boot/ast.boot17
1 files changed, 12 insertions, 5 deletions
diff --git a/src/boot/ast.boot b/src/boot/ast.boot
index 0e485759..afff0cf2 100644
--- a/src/boot/ast.boot
+++ b/src/boot/ast.boot
@@ -371,7 +371,7 @@ bfCollect(y,itl) ==
y is ["COLON",a] => bfListReduce('APPEND,['reverse,a],itl)
y is ["TUPLE",:.] =>
bfListReduce('APPEND,['reverse,bfConstruct y],itl)
- bfDoCollect(['CONS,y,'NIL],itl,'CDR)
+ bfDoCollect(['CONS,y,'NIL],itl,'CDR,nil)
bfListReduce(op,y,itl)==
g := bfGenSymbol()
@@ -379,12 +379,19 @@ bfListReduce(op,y,itl)==
extrait := [[[g],[nil],[],[],[],[['reverse!,g]]]]
bfLp2(extrait,itl,body)
-bfDoCollect(expr,itl,adv) ==
+bfMakeCollectInsn(expr,prev,head,adv) ==
+ bfIf(['NULL,head],['SETQ,head,['SETQ,prev,expr]],
+ bfMKPROGN [['RPLACD,prev,expr],['SETQ,prev,[adv,prev]]])
+
+bfDoCollect(expr,itl,adv,k) ==
head := bfGenSymbol() -- pointer to the result
prev := bfGenSymbol() -- pointer to the previous cell
body :=
- ['COND,[['NULL,head],['SETQ,head,['SETQ,prev,expr]]],
- ["T",bfMKPROGN [['RPLACD,prev,expr],['SETQ,prev,[adv,prev]]]]]
+ k is 'skipNil =>
+ x := bfGenSymbol()
+ ['LET,[[x,expr]],
+ bfIf(['NULL,x],'NIL,bfMakeCollectInsn(x,prev,head,adv))]
+ bfMakeCollectInsn(expr,prev,head,adv)
extrait := [[[head,prev],['NIL,'NIL],nil,nil,nil,[head]]]
bfLp2(extrait,itl,body)
@@ -398,7 +405,7 @@ bfLp1(iters,body)==
first value
exits :=
exits = nil => nbody
- ["COND",[bfOR exits,["RETURN",value]],['T,nbody]]
+ bfIf(bfOR exits,["RETURN",value],nbody)
loop := ["LOOP",exits,:sucs]
if vars then loop :=
["LET",[[v, i] for v in vars for i in inits], loop]