Ejemplo n.º 1
0
        public static double callUser(UfnCall f)
        {
            Symbol      fn = f.S;       /* 函数名 */
            SymList     symList;        /* 虚拟参数 */
            AbstractAst args = f.L;     /* 实际参数 */

            double[] oldVal, newVal;    /* 保存的参数值*/
            double   v;
            int      nargs;

            if (fn.Func == null)
            {
                //yyerror("call to undefined function {}", fn.Name);
                return(0);
            }

            /* 计算参数个数 */
            symList = fn.SymbolList;
            for (nargs = 0; symList != null; symList = symList.Next)
            {
                nargs++;
            }

            /* 为保存参数值做准备 */
            oldVal = new double[nargs];
            newVal = new double[nargs];

            /* 计算参数值 */
            for (int i = 0; i < nargs; i++)
            {
                if (args == null)
                {
                    //yyerror("too few args in call to {}", fn.Name);
                    return(0.0);
                }

                if (args.NodeType == 'L')        //是否是节点列表
                {
                    newVal[i] = eval(((Ast)args).L);
                    args      = ((Ast)args).R;
                }
                else                             //是否是列表末尾
                {
                    newVal[i] = eval(args);
                    args      = null;
                }
            }

            /* 保存虚拟参数的旧值,赋予新值 */
            symList = fn.SymbolList;
            for (int i = 0; i < nargs; i++)
            {
                Symbol s = symList.Sym;

                oldVal[i] = s.Value;
                s.Value   = newVal[i];
                symList   = symList.Next;
            }

            /* 计算函数 */
            v = eval(fn.Func);

            /* 恢复虚拟参数的值 */

            return(v);
        }
Ejemplo n.º 2
0
 /// <summary>
 /// 定义函数
 /// </summary>
 /// <param name="name"></param>
 /// <param name=""></param>
 public static void dodef(Symbol name, SymList syms, AbstractAst func)
 {
     name.SymbolList = syms;
     name.Func       = func;
 }