package snippets; public sealed interface Expr { record Lit(int value) implements Expr {} record Sum(Expr left, Expr right) implements Expr {} record Diff(Expr left, Expr right) implements Expr {} record Times(Expr left, Expr right) implements Expr {} default int evaluate() { return switch (this) { case Lit(var value) -> value; case Sum(var left, var right) -> left.evaluate() + right.evaluate(); case Diff(var left, var right) -> left.evaluate() - right.evaluate(); case Times(var left, var right) -> left.evaluate() * right.evaluate(); }; } static Expr lit(int value) { return new Lit(value); } static Expr sum(Expr left, Expr right) { return new Sum(left, right); } static Expr diff(Expr left, Expr right) { return new Diff(left, right); } static Expr times(Expr left, Expr right) { return new Times(left, right); } static void run() { sum(lit(1), lit(2)).evaluate(); // 3 sum(diff(lit(10), lit(8)), lit(2)).evaluate(); // 4 } }