コード例 #1
0
        private void Evaluator_PreEvaluateFunction(object sender, FunctionPreEvaluationEventArg e)
        {
            bool isSysFunc = Functions.Any(f => f.Name == e.Name);

            if (!isSysFunc && !UserFuncs.Any(f => f.Name == e.Name))
            {
                throw new InterpreterException($"Unkown function {e.Name} at {Location}");
            }
            if (isSysFunc)
            {
                _7sFunction func = Functions.First(f => f.Name == e.Name);
                object[]    args = new object[0];
                if (e.Args.Count > 0)
                {
                    args = e.Args.Select(a => evaluator.Evaluate(a)).ToArray();
                }
                e.Value = func.Run(args);
                e.FunctionReturnedValue = true;
            }
            else
            {
                UserFunction func = UserFuncs.First(f => f.Name == e.Name);
                object[]     args = new object[0];
                if (e.Args.Count > 0)
                {
                    args = e.Args.Select(a => evaluator.Evaluate(a)).ToArray();
                }
                InterpreterState state = this;
                func.Run(ref state, args);
                e.Value = state.ReturnValue;
                e.FunctionReturnedValue = true;
            }
        }
コード例 #2
0
ファイル: Interpreter.cs プロジェクト: waldoswify93/7Sharp
 private void AddUserFunctions(object sender, FunctionPreEvaluationEventArg e)
 {
     foreach (var kv in userFunctions)
     {
         if (kv.Key == e.Name)
         {
             if (e.Args.Count == kv.Value.NumberOfArgs())
             {
                 e.CancelEvaluation = false;
             }
             else
             {
                 WriteLineColor($"{e.Name} expects {kv.Value.NumberOfArgs()}, but you put {e.Args.Count}", Red);
                 e.CancelEvaluation = true;
             }
             e.Value = kv.Value.Run(e.EvaluateArgs());
         }
     }
 }