コード例 #1
0
        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++;
        }
コード例 #2
0
 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;
 }
コード例 #3
0
        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);
        }
コード例 #4
0
        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;
            }
        }
コード例 #5
0
        //////

        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));
        }
コード例 #6
0
        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);
        }
コード例 #7
0
        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());
            }
        }