sclass SimpleInterpreter { sclass State { new LinkedHashMap vars; new L stack; selfType set(S var, O value) { vars.put(var, value); this; } O eval(Instruction i) { i.run(this); ret pop(); } O get(S var) { ret mapGet(vars, var); } void push(O value) { stack.add(value); } O pop() { ret popLast(stack); } } asclass Instruction { abstract void run(State state); } srecord GetVar(S var) > Instruction { void run(State state) { state.push(state.get(var)); } } srecord Sequence(L l) > Instruction { Sequence(Instruction... l) { this.l = asList(l); } void run(State state) { fOr ping (Instruction i : l) i.run(state); } } State newState() { ret new State; } }