next up previous
Next: 6 マクロの処理 Up: 5 ユーザ定義関数を作る Previous: 5.2 クロージャを作る

5.3 クロージャデータ

クロージャデータの構造は以下のようになっています. (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日