next up previous contents index
Next: 参照セルと純粋未定義変数セル Up: KL1レベルのデータ構造 Previous: ワード

       
CONSとファンクタ

整数、アトムの場合にはそのタグ付きの値が1つのセルにおさまるため、 そのまま格納する。CONS, ファンクタでは、複数セルが必要になるため、 実体は別に領域を確保し、その実体へのポインタを各々CONS、FUNCタグ付きの ポインタをセル内に格納する。 つまり、ポインタに「この先の連続領域はCONS/ファンクタである」と記述してある (図2.2参照)。


  
Figure 2.2: CONSとファンクタ
\begin{figure}\begin{center}
\epsfile{file=cons.eps,width=.3\textwidth}
\epsfile{file=func.eps,width=.3\textwidth}
\end{center}\end{figure}

CONSは連続した2ワードの領域であり、CDRが下位ワードCARが上位ワードにある [*]。 Cのレベルでは以下のように表現されている。

struct cons {
  q cdr, car;
};

ファンクタは(引数個数+1)ワードの領域を確保する。

struct functor {
  q functor;                    /* principal functor as atomic q object */
  q args[1];                    /* arguments */
};

ポインタが指す最初のセル には、「ファンクタID」と呼ばれるデータが記述されている。 このファンクタIDにより、 当該ファンクタの主ファンクタと引数個数がわかるようになっている (これらの2つデータを1ワードにエンコードしてある、と見なすことができる)。 より具体的には、このファンクタIDは、線型配列である「ファンクタID表」 (include/klic/functorstuffs.h内の変数functorsにより表現される) への配列インデックスであると見なすことができる。 正確にはファンクタIDにはアトムの4bitタグが付加されており、上位 28bitが上記の表のインデックスである。 このファンクタIDの4bitタグは重要である。というのは、 ここがREFタグになてっている場合にはジェネリック・オブジェクト (の一種のデータオブジェクト([*]ページ、第2.3.2章参照))であることを表わしている からである。



Sekita Daigo
1998-05-18