Path: titcca!ccut!kyu-cs!champon!umerin From: umerin@tc.Nagasaki.GO.JP (Masanobu UMEDA) Newsgroups: fj.lang.lisp Subject: Re: CLOS performance. (In Japanese/Kanji) Message-ID: Date: 23 Mar 90 02:03:30 GMT References: Sender: news@tc.nagasaki.go.jp Reply-To: umerin@tc.Nagasaki.GO.JP Distribution: fj Organization: Technology Center, Nagasaki, Japan. Lines: 38 In-reply-to: yosikawa@ccs.mt.nec.junet's message of 22 Mar 90 01:16:26 GMT In article yosikawa@ccs.mt.nec.junet (Masazumi Yoshikawa) writes: まず,単純に考えた場合, (defun slot-value (object slot-name) (slot-value-using-class (class-of object) object slot-name)) と定義されています.(slot-value-using-class は,メタクラス のメソッドとして定義されています.) 一方,アクセサはメソッドとして定義されるというデメリットもあ りますが, (slot-value-using-class (class-of object) object slot-name) の (class-of object) と slot-name が分かっている分速いと考え られます.slot-value-using-class を呼ぶ必要はない訳です. (もっとも,slot-value も slot-name が 'xxx の形で渡されてい る部分だったら同様に最適化が可能だとは思いますが.) そうです。実際に、PCL ではこれを行なっているようです。ただし、 standard-class をメタクラスに用いている場合だけです。standard-class の slot-value-using-class メッソッドの前後 (:before :after) などにユーザ がメッソドを定義することはないという前提に立って、これを行なっていると 考えます。アクティブバリューを実現したい人は、独自のメタクラスを作れば よいし、standard-class のメソッドを変更することは、CLOSのカーネルの動 作を変更することになるので、普通のユーザはまず行なわないからでしょう。 (defmethod OPTIMIZE-SLOT-VALUE ((class standard-class) form) (destructuring-bind (ignore instance slot-name) form `(standard-instance-access ,instance ',(reduce-constant slot-name)))) このあたりのコードが、メタオブジェクトプロトコルの重要性を示しているよ うな気がします。 -- Masanobu UMEDA umerin@tc.Nagasaki.GO.JP