- Run prog5; * main(3) * on(#1) * pred(#nil) * with(2) * setTrue(#3) * setFalse(#4) * if(3) * on(#2) * ifTrue(#nil) * run(#nil) * main(2) * on(#1) * pred(#nil) * with(1) * setTrue(#7) * setFalse(#8) * if(2) * on(#6) * ifTrue(#nil) * run(#nil) * main(1) * on(#1) * pred(#nil) * with(0) * setTrue(#11) * setFalse(#12) * if(1) * on(#10) * ifTrue(#nil) * run(#nil) * main(0) * on(#1) * pred(#nil) * with(~1) * setTrue(#15) * setFalse(#16) * if(0) * on(#14) * ifFalse(#nil) * run(#nil) class Count { main(arg) = { if := new Truth t := ((new Run).on(self)).with((arg).pred(nil)) f := new Noop (if).setTrue(t) (if).setFalse(f) (if).if(arg) } :f :t :if } class Noop { run(arg) = { } :target } class Run { run(arg) = { (target).main(argt) } with(arg) = { argt := arg self } on(arg) = { target := arg self } :argt :target } class False { on(arg) = { (arg).ifFalse(nil) } } class True { on(arg) = { (arg).ifTrue(nil) } } class Truth { if(arg) = { (cond (arg) True False).on(self) } ifFalse(arg) = { (false).run(nil) } ifTrue(arg) = { (true).run(nil) } setFalse(arg) = { false := arg } setTrue(arg) = { true := arg } :false :true } (new Count).main(3) #nil val it = I_OBJ ~1 : Sem.Id -