public Value Visit(Expr.Sequence seq) { Value evaled = new Value.VUnit(seq.Span); foreach (Expr e in seq.Exprs) { evaled = InterpreterVisitor.Interpret(_env, e); } return(evaled); }
public Value Visit(Expr.Application app) { Value fn = InterpreterVisitor.Interpret(_env, app.Fn); if (fn.Type() != TypeName.Lambda) { throw new ErrorBuilder().Msg($"expected a lambda, found a {fn.Type().Display()}").Type(ErrorType.Type) .Span(app.Fn.Span).Build(); } Value.VLambda lam = (Value.VLambda)fn; return(lam.Lam(new Thunk(() => { Value val = InterpreterVisitor.Interpret(_env, app.Arg); val.Span = app.Span; return val; }))); }
public Value Visit(Expr.Assignment assign) { _env.Define(assign.Name.Name, new Thunk(() => InterpreterVisitor.Interpret(_env, assign.Value)), assign.Span); return(_env.Lookup(assign.Name)); }
public VLambda(Env env, Expr.Variable binder, Expr expr, Span span) : base(span) { Lam = (th) => InterpreterVisitor.Interpret(new Env(env, binder.Name, th), expr); }