Example #1
0
        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);
        }
Example #2
0
        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);
        }