# E.clcl
interface E {
def eval():int;
}
class EInt {
i:int
def initialize(i:int) {
self.i = i
}
def eval():int {
return self.i;
}
}
class EAdd {
l: E;
r: E;
def initialize(l:E,r:E) {
self.l = l;
self.r = r;
}
def eval():int {
return self.l.eval() + self.r.eval();
}
}
class EMul {
l: E;
r: E;
def initialize(l:E,r:E) {
self.l = l;
self.r = r;
}
def eval():int {
return self.l.eval() * self.r.eval();
}
}
# E.cl
def ef(e:E):int {
if (e.is("EInt")) {
return e.i;
} elif (e.is("EAdd")) {
# return ef(e.l)+ef(e.r); error
return e.l.eval()+e.r.eval();
} elif (e.is("EMul")) {
# return ef(e.l)*ef(e.r); error
return e.l.eval()*e.r.eval();
} else {
return 0;
}
}
println(new EMul(new EInt(10),new EAdd(new EInt(1),new EInt(2))).eval().toString())
println(ef(new EMul(new EInt(10),new EAdd(new EInt(1),new EInt(2)))).toString());