Next: 2.4 print
Up: 2.3 eval
Previous: 2.3.5 マクロ展開
ユーザ定義関数を評価するのがevfunです.
/* evfun - evaluate a function */
LOCAL LVAL evfun(fun,argc,argv)
LVAL fun; int argc; LVAL *argv;
{
LVAL oldenv,oldfenv,cptr,name,val;
CONTEXT cntxt;
/* protect some pointers */
xlstkcheck(3);
xlsave(oldenv);
xlsave(oldfenv);
xlsave(cptr);
/* create a new environment frame */
oldenv = xlenv;
oldfenv = xlfenv;
xlenv = xlframe(getenv(fun));
xlfenv = getfenv(fun);
/* bind the formal parameters */
xlabind(fun,argc,argv);
/* setup the implicit block */
if (name = getname(fun))
xlbegin(&cntxt,CF_RETURN,name);
/* execute the block */
if (name && setjmp(cntxt.c_jmpbuf))
val = xlvalue;
else
for (val = NIL, cptr = getbody(fun);
consp(cptr); cptr = cdr(cptr))
val = xleval(car(cptr));
/* finish the block context */
if (name)
xlend(&cntxt);
/* restore the environment */
xlenv = oldenv;
xlfenv = oldfenv;
/* restore the stack */
xlpopn(3);
/* return the result value */
return (val);
}
ユーザ定義の関数の本体の実行は,本体の要素を順に解釈実行する
だけでよいということがわかります.
generated through LaTeX2HTML. M.Inaba 平成18年5月6日