/* 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); }ユーザ定義の関数の本体の実行は,本体の要素を順に解釈実行する だけでよいということがわかります.