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

时间:2012-03-02 03:28:02

标签: common-lisp clos

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

(defclass foo ()
  ((x :reader x :initarg x)))

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

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

我宁愿诉诸:

(defclass foo ()
  ((x :reader x :initarg x :initform nil)))

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

1 个答案:

答案 0 :(得分: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)

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