iface HasEnv { env: Map, } iface HasVal { val: str, } alias Ident = /([a-zA-Z][a-zA-Z0-9_]*)|(_[a-zA-Z0-9_]+)/ node Expr : HasEnv + HasVal { "let" "=" "in" => { body.env = self.env.with(name, val); self.val = body.val; } => { // TODO: does env need to be referenced here? // TODO: how to check for unbound names ahead of time // (for self-implementation) self.val = self.env.lookup(name); } => { self.val = string; } }