コード例 #1
0
        private object ExecuteFunction(StringSegment _name, IList <object> l_params)
        {
            string name = _name.Trim().ToString();

            object[] a_evaluated = null;
            if (l_params != null)
            {
                a_evaluated = new object[l_params.Count];
                l_params.CopyTo(a_evaluated, 0);
                for (int i = 0; i < a_evaluated.Length; ++i)
                {
                    IEvaluator expr = a_evaluated[i] as IEvaluator;
                    if (expr != null)
                    {
                        a_evaluated[i] = expr.Evaluate();
                    }
                }
            }
            ObjectContext context = CurrentContext.FindFunctionContext(name);

            if (context == null)
            {
                throw ThrowHelper.UndefinedFunction(name);
            }
            else
            {
                TFunctionData _sframe = new TFunctionData(CurrentExecution);
                _sframe.SetAll(a_evaluated);
                _sframe.Name = name;
                context.GetFunction(name).Invoke(_sframe);
                CurrentContext.SetReturns(_sframe);
                return(_sframe.Data);
            }
        }
コード例 #2
0
ファイル: Executer.cs プロジェクト: pcluddite/tbasic
        internal static void Execute(TFunctionData stackFrame, Line codeLine)
        {
            ObjectContext context = stackFrame.Context.FindCommandContext(codeLine.Name);

            if (context == null)
            {
                Evaluator eval   = new Evaluator(new StringSegment(codeLine.Text), stackFrame.StackExecuter);
                object    result = eval.Evaluate();
                stackFrame.Context.PersistReturns(stackFrame);
                stackFrame.Data = result;
            }
            else if (codeLine.IsFunction)
            {
                throw ThrowHelper.ExpectedSpaceAfterCommand();
            }
            else
            {
                stackFrame.SetAll(codeLine.Text);
                context.GetCommand(codeLine.Name).Invoke(stackFrame);
            }
            stackFrame.Context.SetReturns(stackFrame);
        }