読書会メモ 第1回

『計算機プログラムの構造と解釈』社内勉強会の第一回が開催されました。当面のコンセプトは「プログラマとしての基礎力の向上」です。
今後、勉強会の中で気づいたことや、演習の解答などをメモしていくことにしたいと思います。

計算機プログラムの構造と解釈

計算機プログラムの構造と解釈

化内

第1章―第1節〜第2節途中(p1〜p20)

メモ

Lisp*1の式の一般形

( …)


Ex (+ 100 35) → 135

 Lispでは基本演算子も、利用者に定義される手続きも、式は全てこの形式に従って評価される(ただし、ifやdefineもしくはdefunなどの特殊形式を除く)。これはLispの言語仕様上大変自明なことではあるが、その単純な規定こそがLisp再帰性、自己言及性の保持を可能足らしめている。例えば、多くの言語では基本演算子はプリミティブに定義された特殊な形式をとっている*2が、その理由は人間の直感的な把握を容易にするための「本質的ではない言語仕様」なのだろうという話だった。つまり、Lispでは可読性を犠牲にする代わりに大きな柔軟性を手にしており、難しいが強力といわれている理由の一つもそこにある。具体的にどのようにその柔軟性を生かすことができて、それによってどのようなメリットが生まれるのかは、この本を通して深く学んでいけるはず。

ある言語の最も基本的な仕様を一つ読んだだけで、これだけの考察がなされ得るということに感動してしまった。以上のような話はJavaの世界にいるだけでは決して知り得ないわけで、ひとつ次元を登ることの面白さに改めて気づかされた。

手続きとその生成プロセスについて

Schemeはfor文やwhile文を持たないため、ループは再帰的手続きによって表現する。ただし、ある手続きが再帰的な構造を持っていることと、その評価結果として生成されるプロセスが再帰的であるかということには関連はない。再帰的手続きによって遅延評価が発生した場合にその計算に必要な情報の量は線形に大きくなるが、遅延評価が発生しない形の再帰的手続きは常に一定量の計算空間でなされる反復的プロセスを生成する。効率を考えるのであればもちろん後者が好ましいが、ツリー構造のデータを扱う場合には前者によって直感的かつ容易な設計が可能となる。

追記

「遅延評価」という言葉は適切ではないというご指摘をいただきました。全くその通りで、遅延評価とは、何らかの式の評価をその評価結果が必要となるときまで遅らせるという処理系の挙動のことです。上で私が言おうとしていたのは、たとえ再帰的手続きであっても、その再帰呼び出しが末尾にないと、命令のスタックが次々に積み上がっていってしまうという状態のことです。(参照:末尾再帰


実際の演習などは次回以降のメモで。

*1:この本の中ではLispの方言であるSchemeが用いられていますが、Lisp一般に関する話に関してはLispと表現します。特にSchemeに限定された話に関しては明示的にSchemeと書きます。

*2: 例えば (+ x y) ではなく (x + y) と書く