Function SLOT-VALUE
slot-value object slot-name => value
object - オブジェクト
name - シンボル
value - オブジェクト
関数slot-valueは、objectのスロット名slot-nameの値を返却します。 もしスロット名slot-nameが存在しないときはslot-missingが呼ばれます。 もしスロットがunboundのときは、slot-unboundが呼ばれます。
スロットの値を変更するときに、 マクロsetfのslot-valueが使えます。
(defclass foo ()
((a :accessor foo-a :initarg :a :initform 1)
(b :accessor foo-b :initarg :b)
(c :accessor foo-c :initform 3)))
=> #<STANDARD-CLASS FOO 244020371>
(setq foo1 (make-instance 'foo :a 'one :b 'two))
=> #<FOO 36325624>
(slot-value foo1 'a) => ONE
(slot-value foo1 'b) => TWO
(slot-value foo1 'c) => 3
(setf (slot-value foo1 'a) 'uno) => UNO
(slot-value foo1 'a) => UNO
(defmethod foo-method ((x foo))
(slot-value x 'a))
=> #<STANDARD-METHOD FOO-METHOD (FOO) 42720573>
(foo-method foo1) => UNOなし。
スロットから読み込むときに、 objectにはスロット名slot-nameが存在しないときは、 slot-missingが次のように呼ばれます。
(slot-missing (class-of instance)
instance
slot-name
'slot-value)(もしslot-missingが起動されたときは、 slot-valueによって第一返却値が返されます。)
スロットに書き込むときに、 objectにはスロット名slot-nameが存在しないときは、 slot-missingが次のように呼ばれます。
(slot-missing (class-of instance)
instance
slot-name
'setf
new-value)(この場合、slot-missingが返却されたとき、 全ての値は無視されます。)
具体的なふるまいは、instanceのメタクラスに依存します。 もしinstanceのメタクラスがstandard-classなら、 決してエラーは発生しません。 もしinstanceのメタクラスがbuilt-in-classなら、 常にエラーが発生します。 もしinstanceが他のメタクラスなら結果は規定されておらず、 状況によってエラーが発生するかもしれませんし、 されないかもしれません。 特にコンディションと構造体についての動作は規定されていません。
slot-missing, slot-unbound, with-slots
実装は必須ではありませんが、 実装者はMetaobject Protocolで説明されている 関数slot-value-using-classを使用して 関数slot-valueを実装することが強く推奨されます。
実装者はslot-valueをコンパイル時にインラインに最適化するかもしれません。