Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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;
            })));
        }
Esempio n. 3
0
 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));
 }
Esempio n. 4
0
 public VLambda(Env env, Expr.Variable binder, Expr expr, Span span) : base(span)
 {
     Lam = (th) => InterpreterVisitor.Interpret(new Env(env, binder.Name, th), expr);
 }