この記事はみす裏 Advent Calendar 20167日目として作成されました。
初めに括弧があった。
Lispを神の言語たらしめている最も大きな理由はその記法にあります。S式と呼ばれるその記法はLispの性質と深く結びついています。S式では()
内に記号を空白区切で並べていきます。そのうち、1番目は関数名とみなされます。
(関数 引数1 引数2 ...)
Lispはこの記法のみで記述することができます。S式はこれほど単純な記法でありながら、驚くほどの表現力を持っています。
それらのデータは、ただコンスセルによって生まれたのである。
Lispの驚くべき特徴の一つは、全てのデータ構造が記号とコンスセルを用いて表現できるということです。コンスセルは二つの参照のペアであり、S式では次のように表されます。
(car . cdr)
コンスセルのペアのうち、1つ目はcar
、2つ目はcdr
と伝統的に呼ばれます(宗派によってはfirst
とrest
と呼ぶこともあります)。コンスセルを使うことで、「構造」を持つデータを表現することができます。最も単純な例にはコンスセルを用いたリストの表現があります。
(1 . (2 . (3 . nil)))
nil
というのはリストの終端を表す記号です。このデータ構造は1, 2, 3
という整数をこの順番で要素に持つ長さ3のリストを表します。
そしてコンスセルはリストとなり、プログラムのうちに宿った。
他の言語とLispを最も異にしているのは、Lispプログラムの記法であるS式がリストを自然に表現するものであることです。同図像性(homoiconicity)と呼ばれるこの性質は、LispプログラムがLispプログラムを操作することを非常に容易にしています。それによって生まれるのがマクロという機構です。
マクロはS式として表現されたLispプログラムを変換します。このマクロはプログラムへのどのような操作も可能にします。理論的に言えば、同図像性を持たないプログラムでもソースコードを加工したり、構文木へと変換して同じことをすることができます。しかし、Lispはそれらの言語に比べはるかに容易な方法でプログラマの負担を最小限に抑えてマクロ機構を実現することができます。
プログラムは層をなした。それは天にもとどくようだった。
マクロによってLispは非常に柔軟な操作をプログラムに行うことができます。これは、プログラマに種々の抽象化を可能にします。プログラムにおける抽象化はインターフェースを用いて実装の詳細を隠蔽することによって行われます。巨大なプログラムを構築する上で抽象化は必須と言っても良い技術です。なぜなら、抽象化によって詳細を気にすることなくより大きな処理の流れに集中することができるからです。適切に抽象化されたプログラムは各機能単位(モジュール)が階層構造をなし、変更に強く保守しやすいものになります。
Lisp自体の説明としては少々物足りないような気がしますが、Lispが神の言語たる所以が多少なりとも感じ取れていただければ幸いです。最後に聖書を紹介いたしましょう。
Land of Lisp
Lispモンスターとして知られる聖獣が表紙に描かれています。Lisp教に入門するものはこの本に当たると良いでしょう。
Let over Lambda
Lispの強力な機構を存分に活用する方法について述べられています。
On Lisp
偉大な宣教師であるPaul Graham氏によって書かれた聖書です。web上で公開されているのでまずは読んでみても良いでしょう。
Structure and Interpretation of Computer Programs(SICP)
Lispの本ではありませんが、計算機科学の古典です。時間があるときに読んでおいても損はしないでしょう。