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