% Function SLOT-VALUE
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
をコンパイル時にインラインに最適化するかもしれません。