Concurrent Clean : ABCマシン(16) : buildとbuildh
の使い分けがまだ良く分かっていない。
おそらく、
- build
- 引数が全て足りている場合の遅延関数オブジェクトを作る
- buildh
- 引数が不足している場合のカリー化関数オブジェクトを作る
という区別なのでしょう。ここまでは分かった。で、その引数に与えられた情報がどのように使われるのかが、まだちょっと自信がない。
buildは3つの引数を取る。
- descriptor_name
- ディスクリプタ
- nr_args
- スタックから取り出す引数の個数
- code_name
- 遅延実行のエントリ
ディスクリプタは、アセンブリで次のように表現されるデータ構造
e__Lib__dapp: .word 0 .word 0 .long yet_args_needed_0 .word 1 .word 8 .long yet_args_needed_1 .word 2 .word 16 .long e__Lib__lapp .word 3 .word 24
これは、Libモジュールに定義されたアリティ3のapp関数のディスクリプタ。「yet_args_needed_0」「yet_args_needed_1」「e__Lib__lapp」はそれぞれ、実行コードのエントリアドレス。「yet_args_needed_?」は、カリー化関数の適用で、引数が不足しているときに呼ばれる実行コードのエントリで、「e__Lib__lapp」は、最後の引数が与えられたときの実行コードのエントリ。
buildで使われるのは、最後の
.word 3 .word 24
の部分だと思われる。この情報を元に、関数オブジェクトのメモリ割り当てを行うのではないかと思われ、そこに、nr_argsで与えられた数の引数とcode_nameで与えられたエントリーを代入し、関数オブジェクトを作るのだという仮説を立てている。