Cogito Ergo Sum.

我思う故に我あり

なんかちょっとわかったような気がする。

 数ヶ月前(?)に本屋で見かけて「そのうち読んでみたいな」と思っていた『初めての人のためのLISP(増補改訂版)』(竹内郁雄(著) 2010年 翔泳社)が図書館に入っていたので借りてきて読み始めた。確かに「天下の奇書」の評判通りムチャクチャな本で大変面白いのだが、哲学書みたいなところもあり、今となっては「初めての人」向けの本とは言えないと思う(元々1980年代前半に雑誌で連載されていたLisp入門をまとめた本なので、ギャグのノリがモロ80年代、というのも今となっては苦笑ポイント(苦笑))。

 そこで、同じく図書館で見つけた『リスト遊び』(山本和彦(著) 2000年 アスキー)を借りてきて読み始めた。これも2000年に出た本で「最近の本」とは言えないかもしれないが、「リストに対する再帰処理」に的を絞った良書だと思う。1,200円と安価なのも良い(僕は図書館で借りたわけだけど)。

 両方を同時進行で読んでいて、先月1年分をまとめて読んだ『日経ソフトウエア』の連載記事「魔法の言葉 関数型言語を学ぼう」もまた読み直したくなってきたのだけど、僕は読んだページは破って捨ててしまっているので手元にない。早く1冊にまとめて特別付録としてつけてくれないかなー(秋頃、特別付録になるのではないかと踏んでいる)。

 で、『初めての人のためのLISP』の最初の4〜5章(全17章)の内容を踏まえて『リスト遊び』の最初の4〜5章(全8章)をジックリ読んでいて、Lispの構造的な秘密に気づいてしまったように思う。直感的には、それがLispのパワーを生んでいるものだろうとも思う。

 僕が中途半端に理解したところによると、Lispプログラムが扱うデータは「リスト」という形式で扱われることになっている。そして、Lispプログラムそのものも同じリストという形式で記述することになっている。つまり、Lispの世界では、データもプログラムも同じ形式をとっている。

 そのことにはすぐに気づいたのだけど(と言うか、そう書いてあるから)、それが意味していることにはすぐには気づかなかった。昨日気づいたのは、両者が同一の形式をとっているということは、Lispプログラムがデータを処理する原理と、LispインタプリタLispプログラムを解釈実行する原理が同一だ、ということだ。

 プログラムはデータを処理する。インタプリタコンパイラは「データを処理するプログラム」をデータとして処理する。それはどんなプログラミング言語だってそうだと思うのだけど(非ノイマン型コンピュータのためのプログラミング言語とかだとひょっとして違うのかなー?とも思うが)、普通は(「普通」ってのは、CだとかJavaだとかBasicだとか)、プログラムがデータを処理する原理とインタプリタコンパイラがプログラムを(データとして)処理する原理は異なっている(のだと思う。僕はインタプリタコンパイラの原理なんて知らないけど)。ところが、Lispでは、どうも両者が完全に同じようなのだ。Lispプログラムがやっていることはリストの処理であり、Lispインタプリタがやっていることもリストの処理である。データもプログラムも同一の形式であるため、こういうことが可能になっている。

 そして、このフラクタクルな二重構造が、きっとLispの(他の言語にはない)パワーを生み出しているに違いない、根拠はないんだけど、そう確信した。たぶん、この二重構造はただの二重構造では終わらない。事実上、無限に二重構造を生み出していけるはず(例えば、Lispプログラムを扱うLispプログラムを扱うLispプログラムを…扱う、という風に)。

 こいつは面白い。


※ 「フラクタクルな二重構造」ってのは「今となっては苦笑ポイント(苦笑)」みたいなこと、って言うか、これは違うか。