MOP (Metaobject Protocol) in One Day に参加してきた

今年も Franz社の「2日間みっちり!Lispチュートリアル&事例紹介セミナー」の一環として (株)数理システムの黒田先生による MOP (Metaobject Protocol) in One Day が開催されました。
内容は、タイトルの通り Common Lisp Object System (CLOS)の Metaobject Protocol に付いてです。このセミナーのターゲットは、The Art of the Metaobject Protocol が一人で読めるようになる事だそうです、要するに CLOS の仕組み・コンセプトをしっかり理解する事です。

The Art of the Metaobject Protocol

私は、CLOSやMOPは使った事が無いのですが、Gauche on Rails を作る際に CLOSに似た Gaucheのオブジェクトシステム を使ったので、CLOSに関しては概要は分かっていましたが、MOPに付いては良く判りませんでした。

内容

The Art of the Metaobject Protocol の第1章は、CLOS/MOPの実装例 Closette のコードを説明です。今回のセミナーでも黒田さんが、ANSII CommonLispで書き直した Clossette のコード片を説明しながら、CLOS/MOP というものがどう実装されているかを説明しました。

第2,3章はMOPを使って CLOS の管理情報を調べたり、CLOSを拡張するサンプルの説明でした。

もちろん、時々脱線しながら黒田節が炸裂 ^^)

感想

CLOS/MOPのコード例を読みながら CLOS/MOPを理解するというのは、Lispの動作を理解するのに Lispで書いた eval/apply のコードを読むのと同様に とてもLispらしいと思いました。MOPのドキュメントを読みながら理解するより判り易く、明確です。

CLOSでは、多重継承やクラスの再定義、メタクラス、既存のメソッドの前後(:before, :after, :around)に実行する実行する補助メソッドが定義できたたりとかなり複雑で、仕様だけでは判りにくいところも多いですが今回のセミナーでとりあえず判りました。

MOPは、CLOSの実装上必要になるメソッド(CLOS自体はオブジェクト指向の上に作られています)の一部やスロット(インスタンス変数)を公開したものというイメージです。したがって、CLOSの拡張はこれらのメソッドを呼び出したり書き換えたり(:aroundを使う事が多いですが)して行います。

昼ご飯のときに id:g000001 さんと話ができた ^^)

今回の黒田語録

  • マクロはアプリーケションを構築するためのDSL定義の為だけに使うべきで、構文の拡張、コーディングの簡略化にはあまり使うべきではない。
  • MOPを使うのは、CLOSの機能だけでは実現できない場合のみ使うべき。その為にもCLOSの仕様は熟知すべき。
  • nil () 'nil '() をちゃんと使い分ける事。