Shammer's Philosophy

My private adversaria

CLOSエクササイズ_slot-boundp

LISP の Class で null check(nil check) をする場合、Java のように

  1. slot(instance 変数)のデータを取得
  2. 取得した値が 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)の値を確認するのではなく、直接フィールド名を指定して行う。