public static Value Execute(Block parentBlock, string source, System.Type type) { source = String.PoRemove(source, ' '); var splitedFormula = Split(source); // 単一項のときは関数か変数か配列か実数(実数はこのifでは処理されない) if (splitedFormula.Length == 1) { var formula = splitedFormula[0]; // 配列 if (formula.Length >= 2 && formula.First() == '[' && formula.Last() == ']') { return(new Value("", ExecuteArray(parentBlock, formula))); } // 括弧 else if (formula.Length >= 2 && formula.First() == '(' && formula.Last() == ')') { return(Execute(parentBlock, formula.PoExtract('(', ')'), type)); } // 関数 else if (formula.Last() == ')') { var caller = new Caller(parentBlock, formula); caller.ForceExecute(); Log.Assert(caller.Function != null, "呼ぼうとした関数が見つかりませんでした:{0}->{1}", parentBlock.FullName, caller.Name); return(new Value("", caller.Function.ReturnedValue)); } // 変数 else { var value = parentBlock.FindValue(formula); if (value != null) { return(value); } } } // 括弧を計算 source = ExecuteBracketCalc(parentBlock, source, type); if (source == "null") { return(new Value("")); } if (type == typeof(int)) { return(new Value("", ExecuteCalcInt(parentBlock, source))); } if (type == typeof(bool)) { return(new Value("", ExecuteCalcBool(parentBlock, source))); } if (type == typeof(string)) { return(new Value("", ExecuteCalcString(parentBlock, source))); } Log.Error("理解できない計算式を演算しようとした:{0} / {1}", source, type.ToString()); return(null); }