KLICのコードでは、以下のようにヒープを利用する。
通常の述語実行中は、allocpなるポインタを介して
そこからの相対アドレスをもってヒープアクセスをする。
述語開始時にはallocpはヒープ割付点を指しており、そこから相対アドレスで
正の方向は空領域である。
具体的には、コード中では allocp[x] (
)
なる記述でヒープアクセスが行われる。
例えば、以下の、nrev/2の1節の出力コードを例にとりヒープの割付の解説を行う。
nrev([A|X], Y) :- nrev(X, X1), append(X1, [A], Y).
この節のコードは、前述の84行目より109行目に出力されているが、ここでは以下の
ようにヒープを利用している(図3.3参照)。以下で
ヒープ割付に関連する部分のみコンパイルドコードを掲載するとともに
解説する(全体のコードは第3.5章 (
ページ)に再掲する)。
[A]を作成する。このためにはallocp[0 - 1]が用いられる(95 - 97行目)。
95 allocp[0] = NILATOM;
96 x1 = car_of(a0);
97 allocp[1] = x1;
allocp[2 - 6]を用いて、append/3のゴールレコード
が作成され、引数が準備される(99 - 103行目)。
99 allocp[2] = (q)qp;
100 allocp[3] = (q)(&predicate_main_xappend_3);
101 allocp[4] = x2 = makeref(&allocp[4]);
102 allocp[5] = x0;
103 allocp[6] = a1;
107 allocp += 7;