[package] [Java implementation] [Execution output]


Expr


import Primitive;

class Expr: {
    const(Primitive: value),
    var(String: name),
    lambda(String: var, Expr: body),
    app(Expr: fun, Expr: arg)
};

toFunction(p) = {proc(fn) −> fn}.get(p);

evaluate(exp, nameToValue) = {
             const(value) −> value,
                var(name) −> nameToValue(name),
      lambda(param, body) −> proc(arg −> evaluate(body, var −> var == param ? arg : nameToValue(var))),
            app(fun, arg) −> {
                                 fun0 = evaluate(fun, nameToValue);
                                 arg0 = evaluate(arg, nameToValue);
                                 toFunction(fun0).apply(arg0);
                              }
}.get(exp);

eval(exp) = evaluate(exp, name −> error("Undefined variable"));

stream << const(v)         = stream << "const(" << v << ")";
stream << var(name)        = stream << name;
stream << lambda(var, exp) = stream << "(" << var << " -> " << exp << ")";
stream << app(fun, arg)    = stream << "(" << fun <<  " " << arg << ")";