From minakaji @ osaka.email.ne.jp Tue Jan 15 20:24:36 2002 From: minakaji @ osaka.email.ne.jp (NAKAJIMA Mikio) Date: Tue, 15 Jan 2002 20:24:36 +0900 Subject: luna =?ISO-2022-JP?B?GyRCJEskRCQkJEY2NSQoJEYyPCQ1JCQbKEI=?= (OO & luna =?ISO-2022-JP?B?GyRCPWk/NDxUGyhCKQ==?= Message-ID: luna について教えて下さい。 grandpa, dad, me の 3 つのクラスを作ります。年長者程、親クラスになる ように継承して定義します。 (luna-define-class grandpa () ()) (luna-define-class dad (grandpa) ()) (luna-define-class me (dad) ()) luna-test method を定義します。grandpa と dad class についてだけ定義し、 me クラスの method は定義しません (me は dad と同じ動作で足りるため)。 dad クラスの method からは :around modifier を使い、granpda クラスの method を呼びます。 (luna-define-generic luna-test (person)) (luna-define-method luna-test ((gp grandpa)) (setq x (1+ x))) (luna-define-method luna-test :around ((dd dad)) (luna-call-next-method) (setq y (1+ y))) テスト用の変数を設定。いずれも 0 で初期化。 (setq x 0 y 0) クラスと同名の変数にそれぞれインスタンス化。 (setq grandpa (luna-make-entity 'grandpa)) (setq dad (luna-make-entity 'dad)) (setq me (luna-make-entity 'me))) method を定義していない末裔の me クラスのインスタンスに対し、luna-test をコールします。 (luna-test me) -> 2 x -> 1 y -> 2 何故 y が 2 になるのかなと、色々調べていたのですが、どうも (1)me インスタンスについて luna-method をコールしたときに、 luna-call-next-method で dad クラスの luna-test 自身がコールされ、 (2)再帰的にコールされた dad クラスの luna-test の中の luna-call-next-method で初めて grandpa の luna-test method がコール される ために y が 2 回加算されてしまうようです。 luna.el の中を色々見ていたのですが、どうも luna-class-find-parents-functions で method が見つかるまで、親クラスに 遡って method の探索をするためにこのような動作になるようです。 [質問] (ア)あるクラスの親 class の method はあるが、(親クラスと同じ動作で良い から) そのクラス自身の method を定義しないことは OO 的に誤りなので しょうか? (イ)(ア)がもし誤りの場合で、親クラスと全く同じ動作で足りる下位のクラス の method は一々親クラスと同じ関数定義をして、そのクラスに特化した method を設けるのが良いのでしょうか? それとも luna-call-next-method を用いて親クラスの method をコールするだけの method を設けるのが良いのでしょうか? それとももっと他に良い方法が あるのでしょうか? (ウ)(ア)がもし誤りの場合で、下位クラスに明示的な method が定義されてい ない場合、una 的に下位のクラスから親クラスの method をコールするの を禁止する必要はないでしょうか? -- 中島幹夫 http://www.asahi-net.or.jp/~gy2m-nkjm/ From minakaji @ osaka.email.ne.jp Tue Jan 15 20:37:32 2002 From: minakaji @ osaka.email.ne.jp (NAKAJIMA Mikio) Date: Tue, 15 Jan 2002 20:37:32 +0900 Subject: luna =?ISO-2022-JP?B?GyRCJEskRCQkJEY2NSQoJEYyPCQ1JCQbKEI=?= (OO & luna =?ISO-2022-JP?B?GyRCPWk/NDxUGyhCKQ==?= In-Reply-To: References: Message-ID: At Tue, 15 Jan 2002 20:24:36 +0900, NAKAJIMA Mikio wrote: > クラスと同名の変数にそれぞれインスタンス化。 > > (setq grandpa (luna-make-entity 'grandpa)) > (setq dad (luna-make-entity 'dad)) > (setq me (luna-make-entity 'me))) dad, grandpa のインスタンスは関係ないですね f(^^;。 -- 中島幹夫 http://www.asahi-net.or.jp/~gy2m-nkjm/ From lapis-lazuli @ pop06.odn.ne.jp Wed Jan 16 00:07:02 2002 From: lapis-lazuli @ pop06.odn.ne.jp (Hiroya Murata) Date: Wed, 16 Jan 2002 00:07:02 +0900 Subject: luna =?ISO-2022-JP?B?GyRCJEskRCQkJEY2NSQoJEYyPCQ1JCQbKEI=?= (OO & luna =?ISO-2022-JP?B?GyRCPWk/NDxUGyhCKQ==?= In-Reply-To: References: Message-ID: ;; 質問に対する回答ではありませんが... In the message [emacs-mime-ja : No.00972] on Tue, 15 Jan 2002 20:24:36 +0900, NAKAJIMA Mikio wrote: > luna.el の中を色々見ていたのですが、どうも > luna-class-find-parents-functions で method が見つかるまで、親クラスに > 遡って method の探索をするためにこのような動作になるようです。 luna-class-find-functions と luna-class-find-member の両方で, 親 クラスを辿っている為に (中島さんの例で言えば) dad の member が, 複数返されてしまうのが原因みたいですね. お手軽な方法としては, 添付のパッチの様にすれば, 期待通りに動作す る様です. ;; でも, find-member が親を辿る方が自然な気もしますね. ~~~~ -- Hiroya Murata (村田 浩也) PGP fingerprint: 53B6 1B4A 8193 A2D4 1526 BC9E 9AEF 2F6D 249D 5F17 -------------- next part -------------- テキスト形式以外の添付ファイルを保管しました... ファイル名: luna.el.patch 型: application/octet-stream サイズ: 786 バイト 説明: 無し URL: From minakaji @ osaka.email.ne.jp Wed Jan 16 19:51:58 2002 From: minakaji @ osaka.email.ne.jp (NAKAJIMA Mikio) Date: Wed, 16 Jan 2002 19:51:58 +0900 Subject: luna =?ISO-2022-JP?B?GyRCJEskRCQkJEY2NSQoJEYyPCQ1JCQbKEI=?= (OO & luna =?ISO-2022-JP?B?GyRCPWk/NDxUGyhCKQ==?= In-Reply-To: References: Message-ID: At Wed, 16 Jan 2002 00:07:02 +0900, Hiroya Murata wrote: > luna-class-find-functions と luna-class-find-member の両方で, 親 > クラスを辿っている為に (中島さんの例で言えば) dad の member が, > 複数返されてしまうのが原因みたいですね. > > お手軽な方法としては, 添付のパッチの様にすれば, 期待通りに動作す > る様です. そうですね。luna-class-find-member 改で希望している動作になることを 確認しました。luna.el をプリントアウトして、帰宅途中の電車の中で見てい たのですが、村田さんの修正が正しいような気がします。luna.el にこの修正 を取り込んではどうでしょうか? P.S. luna-call-next-method の中の luna-next-methods って何を参照しているの でしょうね? global variable でも temporary variable でもないですし...。 -- 中島幹夫 http://www.asahi-net.or.jp/~gy2m-nkjm/ From lapis-lazuli @ pop06.odn.ne.jp Wed Jan 16 23:10:45 2002 From: lapis-lazuli @ pop06.odn.ne.jp (Hiroya Murata) Date: Wed, 16 Jan 2002 23:10:45 +0900 Subject: luna.el: method with &rest In-Reply-To: References: Message-ID: 久し振りに luna.el を読んだので, ついでに考えてみました. In the message [emacs-mime-ja : No.00935] on Mon, 13 Aug 2001 00:47:12 +0900, Keiichiro Nagano (永野圭一郎) wrote: > このように、luna-send を用いた場合には &rest として自然な引数が渡るの > ですが、これを generic で呼び出すと、1段深い list になって渡ってきます。 次の patch でどうでしょうか? -------------- next part -------------- テキスト形式以外の添付ファイルを保管しました... ファイル名: luna.el.patch 型: application/octet-stream サイズ: 1361 バイト 説明: 無し URL: -------------- next part -------------- -- Hiroya Murata (村田 浩也) PGP fingerprint: 53B6 1B4A 8193 A2D4 1526 BC9E 9AEF 2F6D 249D 5F17 From minakaji @ osaka.email.ne.jp Sat Jan 19 06:28:26 2002 From: minakaji @ osaka.email.ne.jp (NAKAJIMA Mikio) Date: Sat, 19 Jan 2002 06:28:26 +0900 Subject: luna =?ISO-2022-JP?B?GyRCJEskRCQkJEY2NSQoJEYyPCQ1JCQbKEI=?= (OO & luna =?ISO-2022-JP?B?GyRCPWk/NDxUGyhCKQ==?= In-Reply-To: References: Message-ID: At Wed, 16 Jan 2002 19:51:58 +0900, NAKAJIMA Mikio wrote: > P.S. > luna-call-next-method の中の luna-next-methods って何を参照しているの > でしょうね? global variable でも temporary variable でもないですし...。 ありゃ? luna-send の temporary variable じゃないか。寝惚けていまし た m(__)m。 P.S. 何故かぼくのメッセージだけが 2 通飛ぶような気が... (これも夢か...)。 -- 中島幹夫 http://www.asahi-net.or.jp/~gy2m-nkjm/ From minakaji @ osaka.email.ne.jp Sat Jan 19 11:42:31 2002 From: minakaji @ osaka.email.ne.jp (NAKAJIMA Mikio) Date: Sat, 19 Jan 2002 11:42:31 +0900 Subject: use of qualifiers of a luna method Message-ID: luna.el で、同名の method につき、異なる qualifier を指定して 複数回 luna-define-method すると、最後に define した method だけが有効 になって他が無効になってしまいます。 [検証] (luna-define-class test () ()) [class [0 0 0 0 0 0 0 0 0 0 0 0 ...] (standard-object) 2] (luna-define-method initialize-instance :before ((test test) &rest init-args) (setq x (1+ x)) test) (luna-define-method initialize-instance :after ((test test) &rest init-args) (setq y (1+ y)) test) (setq x 0 y 0) (luna-make-entity 'test) [test [0 0 0 0 0 0 0]] ; before の方は実行されない。 x -> 0 ; after の方は有効。 y -> 1 簡単に直せそうだったらやろうかと思ったのですが、luna-define-method が そもそも 1 つの qualifier にしか対応していないので挫折しました。 luna.el を使い込むにつれ、どうも advice.el の姿と重なって見えて仕方な いのですが、advice.el が :before, :around, :after の各 qualifier (advice.el では class と呼ばれている) を併用可能なのに対して、luna.el が上記のように 1 つだけの qualifier が有効でしかも、評価の順が有効な qualifier を決めるのは様なのは少し見劣りがするような気がします。 これについて、改善の予定はあるでしょうか? -- 中島幹夫 http://www.asahi-net.or.jp/~gy2m-nkjm/ From minakaji @ osaka.email.ne.jp Sat Jan 19 11:47:23 2002 From: minakaji @ osaka.email.ne.jp (NAKAJIMA Mikio) Date: Sat, 19 Jan 2002 11:47:23 +0900 Subject: use of qualifiers of a luna method In-Reply-To: References: Message-ID: At Sat, 19 Jan 2002 11:42:31 +0900, NAKAJIMA Mikio wrote: > luna.el を使い込むにつれ、どうも advice.el の姿と重なって見えて仕方な > いのですが、advice.el が :before, :around, :after の各 qualifier > (advice.el では class と呼ばれている) を併用可能なのに対して、 すみません、advice.el では qualifier (class) に `:' は付いていません でしたね。 -- 中島幹夫 http://www.asahi-net.or.jp/~gy2m-nkjm/ From minakaji @ osaka.email.ne.jp Sat Jan 19 14:03:00 2002 From: minakaji @ osaka.email.ne.jp (NAKAJIMA Mikio) Date: Sat, 19 Jan 2002 14:03:00 +0900 Subject: luna =?ISO-2022-JP?B?GyRCJEskRCQkJEY2NSQoJEYyPCQ1JCQbKEI=?= (OO & luna =?ISO-2022-JP?B?GyRCPWk/NDxUGyhCKQ==?= In-Reply-To: References: Message-ID: At Sat, 19 Jan 2002 06:28:26 +0900, NAKAJIMA Mikio wrote: > ありゃ? luna-send の temporary variable じゃないか。寝惚けていまし > た m(__)m。 やっぱり見間違い..f(^^;。`luna-apply-generic' の一時変数を参照してい る、というのが正解かな。 -- 中島幹夫 http://www.asahi-net.or.jp/~gy2m-nkjm/