public static CompiledFunction Compile(
            Function function, CompiledFunction[] nestedFunctions, bool isEvalMode)
        {
            Contract.Requires(function != null);
            Contract.Requires(nestedFunctions != null && nestedFunctions.Length == function.NestedFunctions.Count);
            var compiler = new FunctionCompiler(function, isEvalMode);

            return(compiler.Compile(nestedFunctions));
        }
Example #2
0
        private static CompiledFunction Compile(Function function, bool isEvalMode)
        {
            Contract.Requires(function != null);
            Contract.Ensures(Contract.Result <CompiledFunction>() != null);
            // Пока используем простую реализацию на основе рекурсии (потом заменим на обход на основе стека)
            if (function.NestedFunctions.Count == 0)
            {
                return(FunctionCompiler.Compile(
                           function, CompiledFunction.EmptyNestedFunctions, isEvalMode));
            }
            var nestedFunctions = new CompiledFunction[function.NestedFunctions.Count];

            for (var i = 0; i < nestedFunctions.Length; i++)
            {
                nestedFunctions[i] = Compile(function.NestedFunctions[i], false);
                // Для того чтобы раньше освободить ссылку на функцию
                function.NestedFunctions[i] = null;
            }
            return(FunctionCompiler.Compile(
                       function, nestedFunctions, isEvalMode));
        }