Next: 5.2 クロージャを作る
Up: 5 ユーザ定義関数を作る
Previous: 5 ユーザ定義関数を作る
ユーザの関数定義を行うdefunは,xdefun
関数が行っている.
/* xdefun - special form 'defun' */
LVAL xdefun()
{
LVAL sym,fargs,arglist;
/* get the function symbol and
formal argument list */
xlsave1(arglist);
sym = xlgasymbol();
fargs = xlgalist();
arglist = makearglist(xlargc,xlargv);
/* make the symbol point to
a new function definition */
xlsetfunction(sym,
xlclose(sym,
s_lambda,
fargs,arglist,
xlenv,xlfenv));
/* restore the stack and
return the function symbol */
xlpop();
return (sym);
}
defunは,クロージャを作るxlcloseを呼び,
シンボルに関数定義を代入しています.
xlsetfunctionは次のようになっています.
環境変数にそのシンボルがある場合には,
そこへ代入し,そうでなければ大域変数の
シンボルに代入します.
xlsetfunction(sym,val)
LVAL sym,val;
{
register LVAL fp,ep;
/* look for the symbol in the environment list */
for (fp = xlfenv; fp; fp = cdr(fp))
for (ep = car(fp); ep; ep = cdr(ep))
if (sym == car(car(ep))) {
rplacd(car(ep),val);
return;
}
/* store the global value */
setfunction(sym,val);
}
setfunctionはxldmem.hの中にマクロで次のように
定義されています.
#define setfunction(x,v) ((x)->n_vdata[1] = (v))
generated through LaTeX2HTML. M.Inaba 平成18年5月6日