Chapter #8 Examples in Oz
%%%%%%%%%%%%%%%%%%% Chapter - 8 %%%%%%%%%%%%%%%%%%%%%%
% 8.1
{Browse 1#(7 + ((4 - 3) * 5))}
% 8.14
class ExprD
meth accept(Ask ?$) raise abstract() end end
end
class Plus from ExprD
feat L R
meth init(Li Ri)
self.L = Li
self.R = Ri
end
meth accept(Ask ?$) {Ask forPlus(self.L self.R $)} end
end
class Diff from ExprD
feat L R
meth init(Li Ri)
self.L = Li
self.R = Ri
end
meth accept(Ask ?$) {Ask forDiff(self.L self.R $)} end
end
class Prod from ExprD
feat L R
meth init(Li Ri)
self.L = Li
self.R = Ri
end
meth accept(Ask ?$) {Ask forProd(self.L self.R $)} end
end
class Const from ExprD
feat C
meth init(Ci) self.C = Ci end
meth accept(Ask ?$) {Ask forConst(self.C $)} end
end
% 8.13
class ExprVisitorI
meth forPlus(L R ?$) raise abstract() end end
meth forDiff(L R ?$) raise abstract() end end
meth forProd(L R ?$) raise abstract() end end
meth forConst(C ?$) raise abstract() end end
end
% 8.19 | 8.29
class IntEvalV from ExprVisitorI
meth init skip end
meth forPlus(L R ?$) {self plus({L accept(self $)} {R accept(self $)} $)} end
meth forDiff(L R ?$) {self diff({L accept(self $)} {R accept(self $)} $)} end
meth forProd(L R ?$) {self prod({L accept(self $)} {R accept(self $)} $)} end
meth forConst(C ?$) C end
meth plus(L R ?$) L + R end
meth diff(L R ?$) L - R end
meth prod(L R ?$) L * R end
end
% 8.3
local E in
E = {New Plus init(
{New Const init(7)}
{New Prod init(
{New Diff init(
{New Const init(4)}
{New Const init(3)})}
{New Const init(5)})})}
{Browse 3#{E accept({New IntEvalV init} $)}}
end
% 8.32
class SetD
meth add(I ?$)
if {self mem(I $)}
then self
else {New Add init(I self)}
end
end
meth mem(I ?$) raise abstract() end end
meth plus(S ?$) raise abstract() end end
meth diff(S ?$) raise abstract() end end
meth prod(S ?$) raise abstract() end end
end
% 8.36
class Empty from SetD
meth init skip end
meth mem(N ?$) false end
meth plus(S ?$) S end
meth diff(S $) {New Empty init} end
meth prod(S $) {New Empty init} end
end
class Add from SetD
feat I S
meth init(Ii Si)
self.I = Ii
self.S = Si
end
meth mem(N ?$)
if self.I == N
then true
else {self.S mem(N $)}
end
end
meth plus(T ?$)
{self.S plus({T add(self.I $)} $)}
end
meth diff(T ?$)
if {T mem(self.I $)}
then {self.S diff(T $)}
else {{self.S diff(T $)} add(self.I $)}
end
end
meth prod(T ?$)
if {T mem(self.I $)}
then {{self.S prod(T $)} add(self.I $)}
else {self.S prod(T $)}
end
end
end
% 8.9
local E in
E = {New Plus init(
{{{New Empty init} add(7 $)} add(5 $)}
{New Prod init(
{New Diff init(
{{New Empty init} add(4 $)}
{{New Empty init} add(3 $)})}
{{New Empty init} add(5 $)})})}
end
% 8.26
local E in
E = {New Plus init(
{New Const init({New Empty init})}
{New Const init(5)})}
% {Browse 26#{E accept({New IntEvalV init} $)}}
end
% 8.43
class SetEvalV from IntEvalV
meth plus(L R ?$) {L plus(R $)} end
meth diff(L R ?$) {L diff(R $)} end
meth prod(L R ?$) {L prod(R $)} end
end
% 8.51
local E in
E = {New Prod init(
{New Const init({{New Empty init} add(7 $)})}
{New Const init({{New Empty init} add(3 $)})})}
{Browse 51#{E accept({New SetEvalV init} $)}}
end
% 8.76
class EvalD
meth forPlus(L R ?$) {self plus({L accept(self $)} {R accept(self $)} $)} end
meth forDiff(L R ?$) {self diff({L accept(self $)} {R accept(self $)} $)} end
meth forProd(L R ?$) {self prod({L accept(self $)} {R accept(self $)} $)} end
meth forConst(C ?$) C end
meth plus(L R ?$) raise abstract() end end
meth diff(L R ?$) raise abstract() end end
meth prod(L R ?$) raise abstract() end end
end
% 8.78
class IntEval2V from EvalD
meth init skip end
meth plus(L R ?$) L + R end
meth diff(L R ?$) L - R end
meth prod(L R ?$) L * R end
end
% 8.43
class SetEval2V from EvalD
meth plus(L R ?$) {L plus(R $)} end
meth diff(L R ?$) {L diff(R $)} end
meth prod(L R ?$) {L prod(R $)} end
end
% 8.81
class PieVisitorI
meth forBottom(?$) raise abstract() end end
meth forTopping(T R ?$) raise abstract() end end
end
class SubstituteV_ from PieVisitorI
feat N O
meth init(Ni Oi)
self.N = Ni
self.O = Oi
end
meth forBottom(?$) {New Bottom init} end
meth forTopping(T R ?$)
if {self.O equals(T $)}
then {New Topping init(self.N {R accept(self $)})}
else {New Topping init(T {R accept(self $)})}
end
end
end
class LimitedSubstituteV_ from PieVisitorI
feat C N O
meth init(Ci Ni Oi)
self.C = Ci
self.N = Ni
self.O = Oi
end
meth forBottom(?$) {New Bottom init} end
meth forTopping(T R ?$)
if self.C == 0
then {New Topping init(T R)}
else
if {self.O equals(T $)}
then {New Topping init(self.N {R accept({New LimitedSubstituteV init(self.C-1 self.N self.O)} $)})}
else {New Topping init(T {R accept(self $)})}
end
end
end
end
class PieD
meth accept(Ask ?$) raise abstract() end end
end
class Bottom from PieD
meth init skip end
meth accept(Ask ?$) {Ask forBottom($)} end
end
class Topping from PieD
feat T R
meth init(Ti Ri)
self.T = Ti
self.R = Ri
end
meth accept(Ask ?$) {Ask forTopping(self.T self.R $)} end
end
% 8.86
class SubstituteD
feat n o
meth init(N O)
self.n = N
self.o = O
end
meth forBottom(?$) {New Bottom init} end
meth forTopping(T R ?$) raise abstract() end end
end
% 8.87
class SubstituteV from SubstituteD
meth init(N O)
SubstituteD,init(N O)
end
meth forTopping(T R ?$)
if {self.o equals(T $)}
then {New Topping init(self.n {R accept(self $)})}
else {New Topping init(T {R accept(self $)})}
end
end
end
class LimitedSubstituteV from SubstituteD
feat C
meth init(C N O)
self.C = C
SubstituteD,init(N O)
end
meth forTopping(T R ?$)
if self.C == 0
then {New Topping init(T R)}
else
if {self.o equals(T $)}
then {New Topping init(self.n {R accept({New LimitedSubstituteV init(self.C-1 self.n self.o)} $)})}
else {New Topping init(T {R accept(self $)})}
end
end
end
end
|