Пример #1
0
        public RTResult Execute(List <LToken> args, Context _context, TextPosition pos)
        {
            RTResult res = new RTResult();
            Context  ctx = parent.context.Copy();

            ctx.name           = name.value.text;
            ctx.parentEntry    = pos;
            ctx.parent         = _context;
            ctx.lastIn         = this;
            ctx.varlist.parent = DeffCon.varlist;
            if (Predefs.ContainsKey(name.value.text) || Special.ContainsKey(name.value.text))
            {
                for (int n = 0; n < args.Count; n++)
                {
                    ctx.varlist.Add("_ARG" + n, args[n].SetContext(ctx));
                }
            }
            else
            {
                for (int n = 0; n < argNames.Count; n++)
                {
                    if (n < args.Count)
                    {
                        ctx.varlist.Add(argNames[n], args[n].SetContext(ctx));
                    }
                    else
                    {
                        ctx.varlist.Add(argNames[n], new LToken(TokenType.VALUE, Value.NULL, pos).SetContext(ctx));
                    }
                }
            }

            LToken t;

            if (Predefs.ContainsKey(name.value.text))
            {
                t = res.Register(Predefs[name.value.text](ctx, args.Count));
            }
            else if (Special.ContainsKey(name.value.text))
            {
                t = res.Register(Special[name.value.text](ctx, args.Count));
            }
            else
            {
                t = res.Register(Interpreter.Visit(body, ctx));
            }
            if (res.error != null)
            {
                return(res);
            }
            return(res.Succes(t.SetContext(ctx)));
        }