public override Continuation Evaluate(Continuation c, Datum args) { var datumArgs = args.ToArray(); if (datumArgs.Length != 2) throw c.error("Apply expects 2 arguments. {0} passed", datumArgs.Length); var function = datumArgs[0] as StackFunction; if (function == null) throw c.error("'{0}' is not a function", datumArgs[0]); return function.Evaluate(c, datumArgs[1]); }
public Datum Evaluate(Continuation c) { try { while (c.Task != null) { if (debug) { Console.WriteLine("{0}", c.GetStackTrace()); Console.Write("Press enter for next step."); Console.ReadLine(); } c = c.Task.Perform(c.PopTask()); } c = c.PopTask(); var result = c.Result; c = c.PopResult(); if (c.Result != null) { throw new Exception(string.Format("Additional '{0}' on result stack", c.Result)); } return(result); } catch (EvaluationException) { throw; } catch (Exception ex) { throw c.error(ex, "EvaluationError", ex.Message); } }
private static Datum evaluate(Continuation c, Datum args) { var argList = args.ToArray(); if (argList.Length != 1) throw c.error("invalid syntax '{0}'", args); return argList[0]; }
public Datum Evaluate(Continuation c) { try { while (c.Task != null) { if (debug) { Console.WriteLine("{0}", c.GetStackTrace()); Console.Write("Press enter for next step."); Console.ReadLine(); } c = c.Task.Perform(c.PopTask()); } c = c.PopTask(); var result = c.Result; c = c.PopResult(); if (c.Result != null) throw new Exception(string.Format("Additional '{0}' on result stack", c.Result)); return result; } catch (EvaluationException) { throw; } catch (Exception ex) { throw c.error(ex, "EvaluationError", ex.Message); } }
public override Continuation Evaluate(Continuation c, Environment env, Datum args) { var argList = args.ToArray(); if (argList.Length != 2) throw c.error("Expected 2 arguments: (set! <symbol> <expression>). Got {0} instead", argList.Length); var name = argList[0].CastIdentifier(); var expression = argList[1]; c = c.PushTask(new SetName(env, name)); return c.Evaluate(env, expression); }
public override Continuation Evaluate(Continuation c, LexicalEnvironment env, Datum args) { var argList = args.ToArray(); if (argList.Length != 2) throw c.error("Expected 2 arguments: (define <symbol> <expression>). Got {0} instead", argList.Length); var name = argList[0].CastSymbol(); var expression = argList[1]; c = c.PushTask( tc => { env.Define(name, tc.Result); return tc;}, "define '{0}'", name); return c.Evaluate(env, expression); }
private static Datum evaluate(Continuation c, Environment env, Datum args) { var macroArgs = args.ToArray(); if (macroArgs.Length % 2 != 0) throw c.error("Invalid macro syntax for lambda. Argument count for '{0}' is not even ({1}). Syntax is (lambda [args body]+)", args, macroArgs.Length); var argBodies = new List<ArgBody>(); for (var i = 0; i < macroArgs.Length; i += 2) { var closureArgs = macroArgs[i]; var body = macroArgs[i + 1]; argBodies.Add(new ArgBody(closureArgs, body)); } return new Closure(env, argBodies); }
public override Continuation Evaluate(Continuation c, Environment env, Datum args) { var argList = args.ToArray(); if (argList.Length < 1) throw c.error("Expected at least 1 expression for begin. Got none."); // Scope any local definitions. var localEnv = new Environment(env); var remaining = argList.Reverse().ToArray(); for (var i = 0; i < remaining.Length; ++i) { if (i > 0) c = c.PushTask(Ignore.Instance); c = c.Evaluate(localEnv, remaining[i]); } return c; }
public override Continuation Evaluate(Continuation c, LexicalEnvironment env, Datum args) { var argList = args.ToArray(); if (argList.Length < 1) throw c.error("Expected at least 1 expression for begin. Got none."); // Scope any local definitions. var localEnv = env.NewFrame(); var remaining = argList.Reverse().ToArray(); for (var i = 0; i < remaining.Length; ++i) { if (i > 0) c = c.PushTask(popResult, "Discard result"); c = c.Evaluate(localEnv, remaining[i]); } return c; }
public override FExpression defaultCase(Datum d) { throw c.error("'{0}' is not callable", d); }
public override Continuation Evaluate(Continuation c, Environment env, Datum args) { var datumArgs = args.ToArray(); if (datumArgs.Length != 1) throw c.error("Ref expect 1s arguments. {0} passed", datumArgs.Length); var assemblyName = datumArgs[0].CastIdentifier(); var assembly = Assembly.Load(assemblyName); // Keep a hash set to avoid adding things twice. // Overload resolution is (hopefully) handled by // InvokeMethod. var symbols = new HashSet<object>(); // Add all static methods foreach (var t in assembly.GetTypes()) { // Make each type have a symbol in the environment also. env.Define(t.FullName, t.ToAtom()); foreach (var mi in t.GetMethods()) { var symbol = string.Format("{0}.{1}", t.FullName, mi.Name); if (mi.IsStatic && symbols.Add(symbol)) env.Define(symbol, new StaticMethod(t, mi.Name).ToStack()); } } return c.PushResult(DatumHelpers.nil); }