[Date Prev][Date Next][Thread Prev][][Date Index][Thread Index]

Re: Problem with sb-rss-hash (bug in luna?)



David Engster writes:

> The problem is indeed that the 'myparent-slot-internal' functions are
> defined as static macros, while 'luna-slot-value' determines the correct
> slot index at runtime, which is slower but needed for inheritance. One
> could simply use these functions instead of the static macros, for
> example with the following patch (against luna.el from flim 1.14.9):

I found an old mail. In this mail, Morioka-san (he is luna.el author) said
"The internal-accessors does not support multiple inheritance".
So I changed sb-rss.el to not use internal-accessors.

However, luna.el has another problem in Diamond Inheritance. In order to
avoid it, please apply attached patch.


[日本語版]
古いメールですが、守岡さんによると internal-accessors は多重継承を
サポートしていないようです。
ということで、sb-rss.el では internal-accessors を使わないようにしました。

しかしながら、luna には別の問題がありました。luna 側で対処するなら、
添付のような感じです。
cf. http://article.gmane.org/gmane.emacs.mime.japanese/689

shimbun 側で対処するなら、sb-hash は shimbun を継承しないようにして、
sb-rss-hash 等からは、委譲にするしかないかと思います。
;; shimbun-hash-update-items のオーバーライドとか、ちょっと面倒そう…。

-- 
有沢 明宏
--- Begin Message ---
>>>>> [emacs-mime-ja : No.01023] にて
>>>>> “中島さん”= NAKAJIMA Mikio <minakaji@xxxxxxxxxxxxxxxxx> さま曰く:
 
中島さん> > 余談ですが私的 luna の覚え書きを書いてみました。
中島さん> > 興味ある方は見てみてやって下さい。

中島さん>   拝見いたしました。簡潔で良いですね。実はぼくも似たようなも
中島さん> のを Palmでごにょごにょ書いていたのですが、先を越されてしま
中島さん> いましたね。qualityも負けているようなので潔く消すことにしま
中島さん> す...f(^^;。

私も見せて頂きました。幾つか気になる点を発見しましたが、それを除けば、
分かりやすくて良いと思います。FLIM に収録したらどうでしょうか?


中島さん>   ところで、これこそ余談なのですが、luna を利用しているコー
中島さん> ドwanderlust や shimbun を見ていてもあまり slot をガシガシに
中島さん> 利用しているコードは見受けられません (ような気がします...)。

中島さん> 自分で書いているコードでは、インスタンス変数のつもりで利用す
中島さん> ることが多いので、ついついスロットを多用してしまいます。

えっと、現状の luna の slot はインスタンス変数のことです。CLOS 的には
slot には、インスタンス変数に相当する「局所 slot」とクラス変数に相当す
る「共有 slot」がありますが、luna では、今の所、共有 slot が実装されて
ないので、結果的に luna の slot = インスタンス変数 となっています。

前述の気になる点の一つは「インスタンス変数もどき」という記述で、これは
もどきじゃなくて「インスタンス変数」のつもりなんです。


そして、もうひとつの気になる記述は accessor に関するものです。luna 的
には正規の accessor は luna-slot-value と luna-set-slot-value です。た
だ、これは毎回名前解決を行って効率が悪いので、効率が問題になる場合の特
例として internal-accessors というものを導入しています。

;; internal-accessors は名前解決を aref/aset に展開します。よって、多
;; 重継承を行ったり、継承した class で制限をかけるような場合には正常な
;; 動作が保証されていません。

そういう訳で、最初は internal-accessors を定義せずに luna-slot-value 
とluna-set-slot-value を使って説明し、後に高速化に関する節を設けて
internal-accessors の説明をすると良いんじゃないかと思います。


中島さん> 結果的にスロットの変数を参照して、その値を一時変数に取って、
中島さん> それを計算してまたスロットに格納する...というコードが非常に
中島さん> 多くなってしまうのですが、こういうコードを書く度に、何か非常
中島さん> に効率の悪いことをやっているような罪悪感に呵まれます。

luna の slot 参照に関する名前解決は obarray, 即ち hash で実現されてい
るので、slot の数に対しては定数時間で処理されると思います。また、
internal-accessors を用いれば、名前解決の部分が定数に展開されるので、
let とも張り合えるのではないでしょうか?(調べてないけど)

-- 
===『幾千億の分子に分かれても ========================================
     決して忘れない。    
     この宇宙が終るまで』              守岡 知彦 (MORIOKA Tomohiko)
====================== Email: <tomo@xxxxxxxxxxxxxxxxxxxxxxxxxx> ======

--- End Message ---
2009-03-27  ARISAWA Akihiro  <ari@xxxxxxxxxxxxx>

	* luna.el (luna-define-class-function): Fix number of slots
	of the diamond inheritance.

Index: luna.el
===================================================================
RCS file: /cvs/root/flim/luna.el,v
retrieving revision 1.2.6.8
diff -u -r1.2.6.8 luna.el
--- luna.el	6 Jul 2005 02:09:04 -0000	1.2.6.8
+++ luna.el	27 Mar 2009 21:38:09 -0000
@@ -79,8 +79,8 @@
 		  (when (setq j (get sym 'luna-slot-index))
 		    (setq name (symbol-name sym))
 		    (unless (intern-soft name oa)
-		      (put (intern name oa) 'luna-slot-index (+ j b))
-		      (setq i (1+ i)))))
+		      (put (intern name oa) 'luna-slot-index (+ j b)))
+		    (setq i (1+ i))))
 		(luna-class-obarray (luna-find-class parent))))
     (setq rest slots)
     (while rest