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