[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Problem with sb-rss-hash (bug in luna?)
- From: ARISAWA Akihiro <ari@xxxxxxxxxxxxx>
- Date: Sat, 28 Mar 2009 08:45:20 +0900
- X-ml-name: emacs-w3m
- X-mail-count: 10798
- References: <871vt76a9l.fsf@xxxxxxxxxxxxxxx> <b4mab7vh32y.fsf@xxxxxxx> <kziqm0sa5e.fsf@xxxxxxxxxxxxxxx> <87vdpzoz3p.fsf@xxxxxxxxxxxxxxxxxxxxxxxxxx> <kzfxh2hlb2.fsf@xxxxxxxxxxxxxxx>
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 ---
- From: tomo@xxxxxxxxxxxxxxxxxxxxxxxxxx (守岡 知彦 / MORIOKA Tomohiko)
- Date: 14 May 2002 18:11:34 +0900
- X-ml-name: emacs-mime-ja
- X-mail-count: 01024
- References: <m2lmaqn9kx.wl@xxxxxxxxxxxxxxxx> <m3wuuarf8k.wl@xxxxxxxxxxxxxxxxx> <20020513112417.509c.bg66@xxxxxxxxxxx> <m3d6w0b243.wl@xxxxxxxxxxxxxxxxx>
>>>>> [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