LISPは凄い!

妻が寝た。マウスが返ってきた。これで重いネタでもすらすら書ける。

今日のランチはターリー屋のカレーだった。そこでfusatsukatsujinさんらと「アスペクト指向LISPに由来するか」という話題で盛り上がった。

私は1986年から8年間LISPを使ってきた。自分史年表で確認すると正確には1985年12月からだった。NTT横須賀通研で日英機械翻訳に携わったのが最初で、VAX-LISPだった。その後、INTERLISP-D(koto,lyric,medley)、CommonLisp(XEROX-Lisp)、Schemeと進んだ。機械翻訳では形態素解析にADAも使っていた。今となっては自慢でもある。なにしろ、ADAを業務で使ったことのあるこの業界の人に、以来会ったことがない。

LISPAOP

少なくとも22年前、Interlisp-Dにはすでにadviceがあった。関数ごとにafter/beforeで任意の処理をputできた。他人の書いたコードでコンパイルされたバイトコードしかない場合に、どんな動きをするのかトレースするのに使っていた。関数の仕様など書かれたものなどほとんどないのだ。だから自分で探るしかなかった。逆アセンブルしてソースコードを生成することも試みてみた。しかしバイトコードはかなり何度もオプティマイズされるので原型のソースを推定するには完成度が足らなかった。そこでadviceを利用するのだ。adviceは1つの関数ごとにしか設定できないので、まず調べたい関数のリストを作ることをしなければならなかった。関数名やloadされた時期などでピックアップして、adviceしたい処理をmap関数で回してそれぞれputするのだ。あとで同じようにadviceを外す必要もあった。なお、ソースコードがある場合は、adviceなど使わなくてもどのステップでもbreakできるので問題にはならない。

というようにアスペクト指向の原点はLISPにあったと確信する。ただLISPの歴史は1960年代からといわれているので、私の時代のさらに20年前であり、どの時点からadviceが組み込まれたのかは分からない。

LISPとPOSTSCRIPT

POSTSCRIPTの前身はXeroxのINTERPRESSだ。POSTSCRIPTには、INTERPRESSとLISPの要素が融合されている。データとコードが一体であること、READ-EVALループで構成されること、オペレータのあとに引数が並ぶこと、これらはLISPの継承だ。ちなみにLISPは、READ-EVAL-PRINTループである。

※スタック利用も似ている。特にPSの辞書スタックとLISPのNameSpaceのスタックの考え方も。(追記)

LISPXML,HTML

XML,HTMLなどのエレメント構成もLISP由来だ。LISPでは1つのsymbolに対し、value,property,function,printnameの4つが設定できる。valueXMLなどでのtag、つまりelementである。そしてpropertyはXMLなどでのattributeに相当する。XMLにもfunctionやprintnameの概念が取り込まれていたらもっと楽しめただろうし、LISPもこれほど衰退しなかったのではと思う。

そのほか、再帰とかガベージコレクションとかLISP由来の概念は一杯、引き継がれて残ってはいる。LISPは凄い!