5

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

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

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

有一种方法可以用 MOP 做到这一点,我觉得这很丑陋。有没有更简单的方法?

我宁愿求助于:

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

并检查它是否为 nil - 在这种情况下 x 可能永远不会是 nil (模棱两可)。

4

1 回答 1

15

搜索包含SLOTin 包的所有符号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,我们可以验证这一点:

于 2012-03-02T09:24:58.270 回答