CLOSエクササイズ_slot-boundp
LISP の Class で null check(nil check) をする場合、Java のように
- slot(instance 変数)のデータを取得
- 取得した値が nil か確認
という手順では NG だとわかった。この手順だと、Unbound slot という趣旨のエラーが出る。値を取得する前に nil でないかを確認しないといけないようだ。その際に使用するのが slot-boundp という関数。
使用例は以下のようになる。
? (defclass foo () ((x :reader getx :writer setx))) #<STANDARD-CLASS FOO> ? (setf nnn (make-instance 'foo)) #<FOO #x302000F41A6D> ? (getx nnn) > Error: Slot X is unbound in #<FOO #x302000F41A6D> > While executing: #<CCL::STANDARD-KERNEL-METHOD SLOT-UNBOUND (T T T)>, in process listener(1). > Type :POP to abort, :R for a list of available restarts. > Type :? for other options. 1 > q ? (slot-boundp nnn 'getx) > Error: #<FOO #x302000F41A6D> has no slot named GETX. > While executing: #<CCL::STANDARD-KERNEL-METHOD SLOT-MISSING (T T T T)>, in process listener(1). > Type :POP to abort, :R for a list of available restarts. > Type :? for other options. 1 > q ? (slot-boundp nnn 'x) NIL ? (setx 100 nnn) 100 ? (slot-boundp nnn 'x) T ? (getx nnn) 100 ?
getter を使用してフィールド(slot)の値を確認するのではなく、直接フィールド名を指定して行う。