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