Next: 6 マクロの処理
Up: 5 ユーザ定義関数を作る
Previous: 5.2 クロージャを作る
クロージャデータの構造は以下のようになっています.
(xldmem.c)
/* newclosure - allocate and
initialize a new closure */
LVAL newclosure(name,type,env,fenv)
LVAL name,type,env,fenv;
{
LVAL val;
val = newvector(CLOSIZE);
val->n_type = CLOSURE;
setname(val,name);
settype(val,type);
setenv(val,env);
setfenv(val,fenv);
return (val);
}
クロージャデータのアクセスマクロはxldmem.h
にあります.
/* closure access macros */
#define getname(x) ((x)->n_vdata[0])
#define setname(x,v) ((x)->n_vdata[0] = (v))
#define gettype(x) ((x)->n_vdata[1])
#define settype(x,v) ((x)->n_vdata[1] = (v))
#define getargs(x) ((x)->n_vdata[2])
#define setargs(x,v) ((x)->n_vdata[2] = (v))
#define getoargs(x) ((x)->n_vdata[3])
#define setoargs(x,v) ((x)->n_vdata[3] = (v))
#define getrest(x) ((x)->n_vdata[4])
#define setrest(x,v) ((x)->n_vdata[4] = (v))
#define getkargs(x) ((x)->n_vdata[5])
#define setkargs(x,v) ((x)->n_vdata[5] = (v))
#define getaargs(x) ((x)->n_vdata[6])
#define setaargs(x,v) ((x)->n_vdata[6] = (v))
#define getbody(x) ((x)->n_vdata[7])
#define setbody(x,v) ((x)->n_vdata[7] = (v))
#define getenv(x) ((x)->n_vdata[8])
#define setenv(x,v) ((x)->n_vdata[8] = (v))
#define getfenv(x) ((x)->n_vdata[9])
#define setfenv(x,v) ((x)->n_vdata[9] = (v))
#define getlambda(x) ((x)->n_vdata[10])
#define setlambda(x,v) ((x)->n_vdata[10] = (v))
#define CLOSIZE 11
generated through LaTeX2HTML. M.Inaba 平成18年5月6日