L.i.S.P 写経(その6)、5章つづき(その2)

前段、

In a certain way, the antidote to functions with a list of dotted variables is the primitive function apply; it converts a list of values into the missing arguments.

急に antidote という仰々しい単語が出てきて面喰ってしまいます。“解毒剤、(比喩的に)防御・対抗手段”という意味のいかつい単語です。
ここは、「関数とドット対といえば、可変長引数の関数定義、それにプリミティプ関数の apply だよね」、というくらい軽い気持ちで理解した上で、あえて antidote という単語を持ってきたんじゃないかなと思います。
「青い空・白い雲」のように軽い表現でも通るところに、あえて厳つい表現を持ってきた、と考えました。


本題、5.4 Functions with Variable Arity より。ここで cons が出てきます。

Functions of variable arity are thus inevitably associated in Scheme with lists, so we must define the denotations of the usual functions (like cons, car, set-cdr!) on lists.

L.i.S.P-chapter5-pile__1.svg

ドット対は $\mathbf{Pair} = \mathbf{Address} \times \mathbf{Address}$ として、$\langle$ アドレス1, アドレス2 $\rangle$ という長さ2の“シーケンス”で表されます。


apply の実装。

L.i.S.P-chapter5-pile__2.svg

局所関数の $flat$ は apply の最後の要素であるリストを処理します。再帰的にドット対を処理して、メモリから参照した値をシーケンスとしてアペンドしてゆきます。$collect$ は、二番目以降の引数をアペンドして、 $flat$ を呼び出します。ここにきての素朴な再帰的実装です。
$wherec$, $and$ などがばんばん出てきて面喰らうところでもあります。


dotted variable を受け取る lambda を考える時に、まず今ある lambda の $valuation$ を変更、$\mathcal{B}$ を導入します。

$\begin{array}{rl} \tau & \equiv~ & \mathbf{Value}^* \times \mathbf{Environment} \times \mathbf{Continuation} \times \mathbf{Memory} \\ & \mathcal{E}~ :& \mathbf{Program} \to \tau \to \mathbf{Value} \\ & \mathcal{B}~ :& \mathbf{ListofVariables} \to (\tau \to \mathbf{Value}) \times \tau \to \mathbf{Value} \\ \end{array}$

この実装も素朴な再帰的なもの、というのは一見してわかるわけだけれども、何をしているのかはよくわからない…。というのが最初の自分の反応です。

L.i.S.P-chapter5-pile__3.svg

しつこく落ち着いて読めば、例えば「再帰的に cons を呼んである種のリストを作る」というのに似ていて、再帰的にカリー化された関数を適用してある種の関数を作る、ということ。特に $μ$ を受け取る関数自体が再帰的に渡す $μ$ になっている、というのを単に見慣れていないためによくわからない、という反応になったんだと思っています。


次に dotted variable を受け取る lambda の部分。
$allocate$ の返した(受け取った)アドレスのシーケンスを直接コンティニュエーション $κ_1$ に渡している部分が、何やってるんだここ?、というのが最初の反応です。

L.i.S.P-chapter5-pile__4.svg

上のconsの所で書いたように、ドット対は長さ2の“シーケンス”で、 cons の実装では陽に $\langle$ アドレス1, アドレス2 $\rangle$ を記述していたのと異なっていて、ここでは $allocate$ の $\alpha^*$ を直接 $κ_1$ に渡しています。理由は、冗長だから、ということなんだろうか。という cons の時と異なっている理由がよく解らないのと、それでいて、 cons と同等の処理なのに字面が違っていること、および、アドレスのシーケンスという一見ドット対用の値が渡されていることがわかりにくい、が相まって、何やっているんだここ?と躓いたんだと思います。