/* 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