我加重了@RainerJoswig 的信息,他在this answer 和this 中给出了类似的问题。归功于他!
洞穴:
这个答案适用于 clisp 和 sbcl。我没有测试的其他实现。
根据Rainer's answer,它应该也可以在 Clozure CL 中使用。
如果您在不同的实现中遇到问题,
您所要做的就是通过(apropos 'slot-definition-name) 和(apropos 'class-slots) 顺便检查一下。 (apropos 'class-direct-slots) 这些关键功能都在哪个包/命名空间中,并像我在这里所做的那样,将特定实现的 #+<implementationname> 子句添加到定义中。
slot-definition-name, class-slots btw class-direct-slots 是 CLOS 的元对象协议 (MOP) 的函数。它们在哪里可用是特定于实现的。
(defun slot-doc (class slot)
(let* ((slots #-sbcl(class-slots (find-class class))
#+sbcl(sb-mop:class-direct-slots (find-class class)))
(i (position slot #-sbcl(mapcar #'slot-definition-name slots)
#+sbcl(mapcar #'sb-mop:slot-definition-name slots)))
(slot-obj (elt slots i)))
(documentation slot-obj t)))
;; usage:
(defclass class1 () ((slot1 :documentation "doc")))
(slot-doc 'class1 'slot1)
;; "doc"
因此,例如在 sbcl 中,您可以通过以下方式获取所有插槽的文档:
(mapcar (lambda (s) (documentation s t)) (sb-mop:class-direct-slots (find-class 'class1))
sb-mop:class-slots 在 sbcl 中做了一些不同的事情。似乎是class-slots 的“假朋友”。
为了不必引用类和槽符号,
你可以用它做一个宏:
(defmacro slot-documentation (class slot)
`(let* ((slots #-sbcl(class-slots (find-class ',class))
#+sbcl(sb-mop:class-direct-slots (find-class ',class)))
(i (position ',slot #-sbcl(mapcar #'slot-definition-name slots)
#+sbcl(mapcar #'sb-mop:slot-definition-name slots)))
(slot-obj (elt slots i)))
(documentation slot-obj t)))
;; usage:
(defclass class1 () ((slot1 :documentation "doc")))
(slot-documentation class1 slot1)
;; "doc"