[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 << ")";