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; }
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()); }