diff options
-rw-r--r-- | src/ChangeLog | 6 | ||||
-rw-r--r-- | src/interp/g-opt.boot | 12 |
2 files changed, 15 insertions, 3 deletions
diff --git a/src/ChangeLog b/src/ChangeLog index e797f8b9..4145348c 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,5 +1,11 @@ 2013-05-14 Gabriel Dos Reis <gdr@integrable-solutions.net> + * interp/g-opt.boot (quoteMode): New. + (optRetract): Use it. + (optPullback): Likewise. + +2013-05-14 Gabriel Dos Reis <gdr@integrable-solutions.net> + * interp/define.boot (checkAndDeclare): Constructor parameter shadowing. * algebra/lodof.spad.pamphlet (SetOfMIntegersInOneToN): [enum]: diff --git a/src/interp/g-opt.boot b/src/interp/g-opt.boot index c65dcf2d..df9d1e75 100644 --- a/src/interp/g-opt.boot +++ b/src/interp/g-opt.boot @@ -805,17 +805,23 @@ optList form == literalElts is "failed" => form quote literalElts +quoteMode x == + x isnt [.,:.] => x + ident? x.op and constructor? x.op => + ['%list,quote x.op,:[quoteMode a for a in x.args]] + [quoteMode y for y in x] + ++ Translate retraction of a value denoted by `e' to sub-domain `m' ++ defined by predicate `pred', optRetract ["%retract",e,m,pred] == e isnt [.,:.] => cond := simplifyVMForm substitute(e,"#1",pred) cond is '%true => e - ['%when,[cond,e],['%otherwise,['moanRetract,e,MKQ m]]] + ['%when,[cond,e],['%otherwise,['moanRetract,e,quoteMode m]]] g := gensym() ['%bind,[[g,e]], ['%when,[substitute(g,"#1",pred),g], - ['%otherwise,['moanRetract,g,MKQ m]]]] + ['%otherwise,['moanRetract,g,quoteMode m]]]] ++ We have an expression `x' of some Union type. Expand an attempted ++ pullback to the `n'th branch of type `t'. @@ -825,7 +831,7 @@ optPullback ['%pullback,x,t,n] == gensym() expr := ['%when,[['%ieq,['%head,y],n],['%tail,y]], - ['%otherwise,['moanRetract,y,MKQ t]]] + ['%otherwise,['moanRetract,y,quoteMode t]]] symbolEq?(x,y) => expr ['%bind,[[y,x]],expr] |