Lispチュートリアル

2日間みっちり!Lispチュートリアル & 事例紹介セミナーの1日目参加した

MOP (Metaobject Protocol) in One Day

Gregor Kiczales 著 The Art of the Metaobject Protocol(略してAMOPというらしい)をベースとしてMOPについて理解することを目的としたセミナー。ならばとAMOP買って読んでみたが、いまいちよくわからない。やや後悔。

そもそもMOPってなに?

Metaobject Protocolなんて言われてもさっぱりわからない。Metaobjectって言われるとOOPっぽいし、Protocolって言われるとネットワークプロトコルみたいなものを考えてします。だいたいLipsにはCLOSっていうOOの仕組みがあるのに、これとは別にMOPが必要な意味がわからない。セミナーでわかるといいが、受講者のレベルが高そうだから、そんなもんはすっ飛ばして説明が始まるかもしれない。

セミナー当日

セミナーでは、講師の黒田さんからAMOPの概要について説明を受ける。黒田さんによるとAMOPは第一章が理解できれば、以降は自力で読み進めることができるそうだ。(もちろん読み進めるスピードには個人差があるけどね)これは勇気づけられる。セミナーでは、第三章までの内容を黒田さんが説明する形式。ただし、説明はAMOPで紹介されているコード(CLOSETTE)をそのまま説明するのではなく、黒田さんがいくつか書き直したものを使用していた。

  • 第一章 クラス定義が実際どのように実現されているかをコードを追いながら説明
  • 第二章 内省(Introspection)を使ってclassや総称関数やmethodにアクセスする方法の説明
  • 第三章 メタクラスの説明や、MOPを使ってloopsやflavor(両方ともLispOOPの別の実装)の挙動に変える方法などの説明

MOPを理解する意味

  • OOPとは何かを学ぶ
  • 言語設計(言語設計とは仕様を切る仕事であって、その成果物は設計書。実装ではない。自分勝手な言語を実装することが言語設計ではない。)
  • DSLをマクロで作るにはどうするか(マクロはDSLを作るための道具。CLOSはDSLの一例)
  • Reflection and bootstrapping(CLOSはCLOSで作られている。自分はまだ理解できていない。)

で、結局MOPって?

自分の理解では、オブジェクト指向プログラミング(例えば、CLOS)を実現するための道具立てを標準化したもの。yet anotherなCLOSという位置づけじゃない。MOPを使えれば、CLOSの挙動をMOPで定義されているクラスを拡張したり、メソッドを書き換えたり、(arroundメソッドを書いたり)して変えることができる。でもMOPはANSI common lispの標準ではないらしい。勿体ない。

質問

Q1:メソッドの引数の順序ではまることはありますか?
A1:あまりない。継承するクラスをどっちを先にするかではまることはある。mix-inクラスを優先させること多いが決まっているわけでもない。
Q2:defclassを書くのって面倒くさい、黒田さんは全部書いていますか?
A2:emacsの機能で楽してるけど、全部書いている。
Q2:マクロは使わないのですか?
A2:マクロを入力量を減らすために使うのは勧めない。Editorでがんばるべき。マクロは新しい語彙を入れ込むためのもの。安易に使うべきでない。自然言語の世界でも自分勝手な言葉を話すやつとはつき合いたくない。
Q3:CLOSのよいスタイルとは?
A3:Tutorial on Good Lisp Programming Styleがよい。postscriptのスライド。Guy styleの本(COMMON LISP第2版)をよく参考にしている。他には、語彙を正しく使うこと(ifを書いたらelseを必ず書くとか)、nil, (), 'nil, '()の使い分け

感想

  • 自分には敷居が高いかなと思っていたが楽しめた。
  • 実践CommonLispを途中までとは言え読んでおいてよかった。
  • ちょっと混乱してしまったのは、メタクラススーパークラスの使い分け方。黒田さんもメタクラススーパークラスは混乱しがちだし、わかったつもりでいても半年くらいしたらまたわからなったりすると言っていたので、まずはあまり気にしないことにする。
  • 黒田さんの語りはとても面白い。
  • セミナーの後によったBERGはとてもよかった。食事もコーヒーもとってもおいしかった。