「私の理解が正しいとか正しくないとか、そら芸者の時に言う話やがな」

以下は私がLispのごく初歩的な文書から得た情報を、私なりの解釈を整理するために書いているもので、仮に私自身の理解が正しかったとしても、言葉としてそれを表現した場合、(いつもよりも)多分に間違いを含んでいる可能性があるが、どうせ正しく理解したい人間はこんな辺境の疑似日記なんぞ読まんだろうから気にしない。

(equal 1 2)を評価する場合を考えてみる。equalは2つの引数を取るが、手続きが取る引数は常に一つである。リスト(equal 1 2)をドット対で表現してみれば、(equal.(1.(2.())))と考えられる。見たとおりに、equalの手続きを適用するのは、(1.(2.()))に対してである(実際はこの中のequalの引数にあたる部分を評価してからになるがすぐ後に。ちなみに1や2は評価してもそのまま1、2である)。equalの手続き内部では、(1.(2.()))のcarとcdrのcarを比べている。
リストフォームの引数もまた、手続きが適用される前に評価されている。(equal (car `(1 2)) 1)の場合はまず(car `(1 2))と1がそれぞれ評価される。ここで(私にとって)重要なのが、この「それぞれ評価される」という部分である。例でのequalの引数にあたる部分をドット対で表現すると、((car.((quote.((1.(2.())).())).())).(1.()))となる。しかしこれを評価したのでは意味が変わってしまう。この中で評価するべきものは、(car.((quote.((1.(2.())).())).()))と、二つ目の1だけである。つまり引数にあたる部分のドット対をまるごと評価してはいかんということである。

で、この、リストの残りの部分を評価する、ということを正しく理解・実装していなかったために私が前回書いたテンプレートでのLisp的表現な何かは、式の評価に関して常に::eval::typeなどとしなければいけなかったり、quoteがうまく表現できなかったのである。そしてこの点を踏まえた上で書いたコードは一応ある。しかしVC8で書いて一部の動作は確認したものの、他の部分ができていないことと、自宅の環境(gcc)では確認していないのと、今からするのはめんどいということから、今日はここまでで。