LISPは凄い!
妻が寝た。マウスが返ってきた。これで重いネタでもすらすら書ける。
今日のランチはターリー屋のカレーだった。そこでfusatsukatsujinさんらと「アスペクト指向はLISPに由来するか」という話題で盛り上がった。
私は1986年から8年間LISPを使ってきた。自分史年表で確認すると正確には1985年12月からだった。NTT横須賀通研で日英機械翻訳に携わったのが最初で、VAX-LISPだった。その後、INTERLISP-D(koto,lyric,medley)、CommonLisp(XEROX-Lisp)、Schemeと進んだ。機械翻訳では形態素解析にADAも使っていた。今となっては自慢でもある。なにしろ、ADAを業務で使ったことのあるこの業界の人に、以来会ったことがない。
LISPとAOP
少なくとも22年前、Interlisp-Dにはすでにadviceがあった。関数ごとにafter/beforeで任意の処理をputできた。他人の書いたコードでコンパイルされたバイトコードしかない場合に、どんな動きをするのかトレースするのに使っていた。関数の仕様など書かれたものなどほとんどないのだ。だから自分で探るしかなかった。逆アセンブルしてソースコードを生成することも試みてみた。しかしバイトコードはかなり何度もオプティマイズされるので原型のソースを推定するには完成度が足らなかった。そこでadviceを利用するのだ。adviceは1つの関数ごとにしか設定できないので、まず調べたい関数のリストを作ることをしなければならなかった。関数名やloadされた時期などでピックアップして、adviceしたい処理をmap関数で回してそれぞれputするのだ。あとで同じようにadviceを外す必要もあった。なお、ソースコードがある場合は、adviceなど使わなくてもどのステップでもbreakできるので問題にはならない。
というようにアスペクト指向の原点はLISPにあったと確信する。ただLISPの歴史は1960年代からといわれているので、私の時代のさらに20年前であり、どの時点からadviceが組み込まれたのかは分からない。