Common Lisp: Как проверить, привязан ли слот? (CLOS) - PullRequest
5 голосов
/ 02 марта 2012

Скажем, у нас есть слот без: initform

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

Как я могу проверить, связан ли слот x экземпляра foo?

Есть способ сделать это с MOPчто я нахожу очень некрасивым.Есть ли более простой способ?

Я бы предпочел прибегнуть к:

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

и просто проверить, равен ли он нулю или нет - в этом случае x может никогда не быть нулевым (неоднозначным).

1 Ответ

15 голосов
/ 02 марта 2012

поиск всех символов с 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, мы можем проверить это:

...