public Node TryEval(Node node, Env env, Logger logger) { // What all functions do. Node firstEvaluationResult = Evaluator.Evaluate(NodeOps.GetChild(node, 1), env); logger.LogVerbose("EvalFun: After first eval: " + NodeOps.Serialize(firstEvaluationResult)); logger.LogVerbose("EvalFun: After first eval: Type:" + firstEvaluationResult.NodeType); int listLength = ListOps.CalculateListLength(node); logger.LogVerbose("EvalFun: Eval number of parameters: " + listLength); // Create copy so we don't change the original data. firstEvaluationResult = NodeOps.CloneTree(firstEvaluationResult); for (int i = 2; i < listLength; i++) { Node additional = Evaluator.Evaluate(NodeOps.GetChild(node, i), env); logger.LogVerbose("EvalFun: Additional value: " + NodeOps.Serialize(additional)); ListOps.AppendToList(additional, firstEvaluationResult); } // What eval does. Node evalResult = Evaluator.Evaluate(firstEvaluationResult, env); logger.LogVerbose("EvalFun: After second eval: " + NodeOps.Serialize(evalResult)); return(evalResult); }
private static Node ApplyMacro(Node node, Node macroNode) { Node parameters = macroNode.Head; Node macroBody = macroNode.Tail; Node clone = NodeOps.CloneTree(macroBody); Dictionary <string, Node> replaceMap = CreateReplacements(parameters, node); // Perform replace. clone = Replace(clone, replaceMap); return(clone); }