Common Lisp:如何检查插槽是否绑定?(CLOS)

mck*_*mck 5 common-lisp clos

假设我们有一个没有的插槽:initform

(defclass foo ()
  ((x :reader x :initarg x)))
Run Code Online (Sandbox Code Playgroud)

如何检查foo实例的插槽x是否绑定?

有一种方法可以用MOP来做到这一点,我觉得非常难看.有没有更简单的方法?

我宁愿诉诸:

(defclass foo ()
  ((x :reader x :initarg x :initform nil)))
Run Code Online (Sandbox Code Playgroud)

并检查它是否为零 - 在这种情况下,x可能永远不会为零(模糊).

Rai*_*wig 15

SLOT在包中搜索所有符号CL:

CL-USER 1 > (apropos "SLOT" "CL")

SLOT-MISSING (defined)
UNBOUND-SLOT-INSTANCE (defined)
SLOT-VALUE (defined)
SLOT-BOUNDP (defined)
SLOT-EXISTS-P (defined)
WITH-SLOTS (defined macro)
SLOT-MAKUNBOUND (defined)
UNBOUND-SLOT
MAKE-LOAD-FORM-SAVING-SLOTS (defined)
SLOT-UNBOUND (defined)
Run Code Online (Sandbox Code Playgroud)

我猜想SLOT-BOUNDP会做你想要的.通过查看Common Lisp HyperSpec,我们可以验证这一点: