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