コード例 #1
0
        public override LispNode CallFunction(LispEnvironment env, LispNode node)
        {
            int given = node.Nested.Count;
            int total = formals.Nested.Count;

            while (node.Nested.Count > 0)
            {
                if (formals.Nested.Count == 0)
                {
                    return(new LispTooManyArgsException(Contents, total, given));
                }

                var sym = formals.Pop() as InputSymbol;
                var val = node.Pop();

                FuncEnv.Add(sym.Symbol, val);
            }

            node.Nested.Clear();

            if (formals.Nested.Count == 0)
            {
                FuncEnv.parentEnv = env;
                return(Interpreter.Evaluate(FuncEnv, new LispList {
                    Nested = body.GetNodeCopy().Nested
                }));
            }
            else
            {
                return(GetNodeCopy());
            }

            // int index = 0;
            // node.Nested.ForEach(n => {
            //         var sym = formals.Nested[index++] as InputSymbol;
            //         FuncEnv.Add(sym.Symbol,n);
            //     });

            // node.Nested.Clear();

            // FuncEnv.parentEnv = env;
        }
コード例 #2
0
ファイル: Variable.cs プロジェクト: tang-junjie/lispdotnet
        public override LispNode Operate(LispEnvironment env, LispNode node)
        {
            var dnode = node.Nested[0] as LispDataList;

            var defs = node.Nested.Skip(0).ToList();

            if (dnode == null)
            {
                return(new LispIncorrectArgTypesException(Contents, 0, LispNodeType.DATALIST.ToString(), node.NodeType.ToString()));
            }

            if (!dnode.Nested.All(n => n is InputSymbol))
            {
                return(new LispNonSymbolException(Contents));
            }

            if (dnode.Nested.Count != node.Nested.Count - 1)
            {
                return(new LispIncorrectNumberToDefineException(Contents));
            }

            int index = 1;

            dnode.Nested.ForEach((n) => {
                var sym = n as InputSymbol;
                if (GlobalAssign)
                {
                    env.AddGlobal(sym.Symbol, node.Nested[index++]);
                }
                else
                {
                    env.Add(sym.Symbol, node.Nested[index++]);
                }
            });

            return(new LispList());
        }