let class Exp { var id : int := 0 method id_get() : int = self.id method accept(v : Visitor) = () } class AssignExp extends Exp { var expression : string := "var foo := bar" method get_expression() : string = self.expression method set_expression(new_expr : string) = (self.expression = new_expr; ()) } class Visitor { method visit(e : Exp) = print_int(e.id_get()) } class PrintVisitor extends Visitor { method visit(e : AssignExp) = print(e.get_expression()) } var exp := new AssignExp var visitor := new PrintVisitor in exp.accept(visitor); exp.set_expression("var bar := foo"); exp.accept(visitor) end