Cogito Ergo Sum.

我思う故に我あり

だんだんわかってきた。

 最近、GaucheLISPの2大方言の1つSchemeの処理系。もう1つはCommon LISP)やLISPの本なんかをチラチラ眺めていて、関数型言語の魅力というものが少しずつわかってきた。

 まず最初に、

  • ルールが少ない。

ということ。瑣末な例かもしれないが、予約語1つとっても(例えば、Javaなんかと比べて)かなり少ないと思う。文法規則もシンプル(特にSchemeがそう。Common LISPに関しては正直よくわからない)。自分を制限するものが少ない、というのは「プログラミングを通して自分自身を自由に表現したい」というようなハッカー気質に合っているのではないかと思う。

 それから、

  • LISPの扱うListというデータ構造(ちなみに、LISPはLISt Processing languageの略で、「Listを扱う言語」)が、単純なデータ構造のわりに複雑な階層構造をもったデータも表現できること(リストの入れ子、つまり「リストのリスト」が可能なため)。

しかも、

  • そのある程度複雑な構造をもつデータから、「リストの先頭要素を取り出す」「先頭要素を除いた残りのリストを取り出す」というたった2つの操作だけで、どんなデータも取り出せること。
  • その処理を関数の再帰呼び出しというかたちでシンプルに記述できること(リストそのものが再帰的な構造をしているため)。

といった辺りがまたハッカー魂をくすぐるのだろう。

 その他に、

  • 処理とデータが同一の形式をとっているので、本質的に処理とデータを区別する必要がないこと。

つまり、

  • 処理そのものをデータとして扱えるわけで、プログラムでプログラムを生み出せること(こういうのを「メタプログラミング」って言うの?)。
  • インタプリタ形式の動的言語なので、「評価」した時点で意味を成すのであれば何でもOK、というような、(静的言語の観点から見ればかなり)トリッキーな記述が可能なこと(悪く言えば「終わり良ければ全て良し」「結果オーライ」みたいなものだから、プログラミング初心者には向かないかもしれないが…)。

 といった辺りもそりゃ、ハッカーとまでいかなくても、プログラマ魂をくすぐるよね。

 あと最近気がついたのは、

  • 副作用のないミニ関数の組み合わせとして複雑な処理を実現する、という感覚が、UNIX/LinuxMS-DOSコマンドラインで、いくつかのミニプログラムをパイプやリダイレクトで結びつけて一発で(ちょっと)複雑な処理を実現する感覚とよく似ている、ということ。

LISPをバリバリ使うような人は普段UNIX/Linuxを使っているような人ではないかと思うので(純粋に偏見ですが…)、UNIX文化にドップリ浸かっている人にこそLISPのそういう部分がアピールするのではないかと思う。