public void AppendElement(Types.Object o) { o = o.Itself; if (o.IsUndefined) { return; } if (this.IsEmpty) { this.First = new ListElement { Value = o, Prev = this.First }; this.Last = this.First; } else { this.Last.Next = new ListElement { Value = o, Prev = this.Last }; this.Last = this.Last.Next; } this.length++; }
public void SetLocal(Types.Identifier identifier, Types.Object value) { if (!Locals.ContainsKey(identifier.Name)) { Locals.Add(identifier.Name, new Types.Identifier { Name = identifier.Name }); } Locals[identifier.Name].Value = value; }
public Types.Object Run(Node.Node node) { System.Diagnostics.Stopwatch t = new System.Diagnostics.Stopwatch(); t.Start(); Types.Object e = Evaluate(node); t.Stop(); Console.BackgroundColor = ConsoleColor.Yellow; Console.ForegroundColor = ConsoleColor.Black; Console.WriteLine("Returned: " + e.ToString() + " in " + t.ElapsedMilliseconds); Console.ResetColor(); return(e); }
public void Concatenate(Types.Object o) { if (o.IsBaseType) { this.AppendElement(o); return; } ListElement pointer = (o as List).First; while (pointer != null) { this.AppendElement(pointer.Value); pointer = pointer.Next; } }
////// private Types.Object CallClosure(Types.Closure closure, Types.Object parameters) { if (!parameters.Itself.IsUndefined) { Types.List.ListElement pointer = (parameters as Types.List).First; for (int i = 0; pointer != null; pointer = pointer.Next, i++) { closure.Environment.SetLocal(new Types.Identifier { Name = closure.Parameters[i] }, pointer.Value.Itself); } } return(new Interpreter(closure.Environment.Copy()).Evaluate(closure.Body)); }
private Types.Object StructuredDoAssign(Node.Structured node) { Types.Object lvalue = Evaluate(node.V); Types.Object rvalue = Evaluate(node.C).Itself; if (lvalue.IsIdentifier) { this.Environment.SetLocal(lvalue as Types.Identifier, rvalue); } else { throw new Exception("Left-hand side is not a valid L-value"); } return(rvalue); }
private Types.Object StructuredDoCall(Node.Structured node) { Types.Object target = Evaluate(node.V); Types.Object parameters = Evaluate(node.C); if (target.IsIdentifier) { if (target.Itself.IsClosure) { return(CallClosure(target.Itself as Types.Closure, parameters)); } else if (target.Itself.IsList) { return((target.Itself as Types.List).At(((parameters as Types.List).First.Value as Types.Number).Value - 1)); } else { if (BuiltIns.Methods.ContainsKey((target as Types.Identifier).Name)) { return(BuiltIns.Methods[(target as Types.Identifier).Name](parameters)); } else { return(new Types.Undefined()); } } } else if (target.Itself.IsClosure) { return(CallClosure(target.Itself as Types.Closure, parameters)); } else if (target.Itself.IsList) { return((target.Itself as Types.List).At(((parameters as Types.List).First.Value as Types.Number).Value - 1)); } else { return(new Types.Undefined()); } }