示例#1
0
    public static NeuOperation Execute(
        this NeuInterpreter interpreter,
        NeuNode node,
        params object[] arguments)
    {
        interpreter.Enter(node);

        ///



        ///

        // TODO: Add hoists

        ///

        var enterPos = interpreter.Stack.Count();

        ///

        var lastValue = NeuOperation.Void;

        ///

        var done = false;

        ///

        for (var i = 0; i < node.Children.Count() && !done; i++)
        {
            var child = node.Children.ElementAt(i);

            ///

            if (child is NeuPunc)
            {
                continue;
            }

            ///

            var childResult = interpreter.Execute(child);

            ///

            switch (childResult)
            {
            case NeuReturnResult returnResult:

                lastValue = returnResult;

                done = true;

                break;

            ///

            case NeuValue value:

                lastValue = value;

                break;

            ///

            default:

                break;
            }
        }

        ///

        interpreter.Unwind(enterPos, node);

        ///

        interpreter.Exit(node);

        ///

        return(lastValue);
    }