2017年1月17日火曜日

EIEIO

 なんじゃ、これ、と思ったら

EIEIO (“Enhanced Implementation of Emacs Interpreted Objects”) provides an Object Oriented layer for Emacs Lisp, following the basic concepts of the Common Lisp Object System (CLOS). It provides a framework for writing object-oriented applications in Emacs.

 ということらしかった。elispに実装されたCLOS風のオブジェクト指向。ちょうどelispでつくっていた個人的なプログラムが動かなくなっていた。EIEIOでつくりなおしてみよう。
 ——よくわからなかった。
 javaなどの経験はあったのでオブジェクト指向プログラミング自体はわかっていると思っていたのだけど、腑に落ちない。そもそもEIEIOではクラスの中にメソッドを定義しているわけではない。あれ?
 ポール・グレアムのCommn Lisp本のCLOSについての一章を読み直したりして一時間ほど考えこんでようやく 腑に落ちた。ああ、そうか、同じことなのか、と。EIEIOではdefmethodでクラスを指定している。それで充分なのだった。おそらく関数に処理が飛びこんだあと、クラスごとのメソッドへ分岐するという仕掛けなのだ(EIEIOは第一引数のクラスでだけで分岐しているのでちょいと面倒)。
 javaやperlだと「オブジェクト.メソッド()」とか、「オブジェクト->メソッド()」になっているのが、EIEIOだと「(メソッド オブジェクト)」となるわけだな、と。
 ただelispにはパッケージという概念がないから既存のfunctionがあると、同名のメソッドは定義できないのでは、と思ったら案の定だった。で、EIEIOで組みなおしている途中で気づいたのだが、プログラムがバリバリの副作用だらけになってしまった……。
 あれ?

メモ
#:g1: Emacs LispのEIEIOはCLOSではない