如何在Common lisp中访问Defclass插槽的:Documentation字符串

时间:2014-01-26 17:56:27

标签: class documentation common-lisp

好的,这是我如何实例化我的Defclass和相关的Defmethod和Defparameter

(defvar *account-numbers* 0)

 (defclass bank-account ()
 ((customer-name
 :initarg :customer-name
 :initform (error "Must supply a customer name.")
 :accessor customer-name
 :documentation "Customer's name")
 (balance
 :initarg :balance
 :initform 0
 :reader balance
 :documentation "Current account balance")
  (account-number
   :initform (incf *account-numbers*)
   :reader account-number
   :documentation "Account number, unique within a bank.")
  (account-type
   :reader account-type
   :documentation "Type of account, one of :gold, :silver, or :bronze.")))

(defmethod initialize-instance :after ((account bank-account)
                   &key opening-bonus-percentage)
(when opening-bonus-percentage
  (incf (slot-value account 'balance)
  (* (slot-value account 'balance) (/ opening-bonus-percentage 100)))))

(defparameter *account* (make-instance
         'bank-account
         :customer-name "Ed Monney"
         :balance 1000000000
         :opening-bonus-percentage 5))

我正在尝试访问任何所述插槽的:文档插槽值,但无法在我正在阅读的书中找到信息,也无法谷歌....

我的尝试包括

 (documentation *account* 'balance)

收到此错误

警告:    不支持的文档:为BANK-ACCOUNT类型的对象键入BALANCE

我试过

(slot-value bank-account ('balance :documentation))

我得到了

The variable BANK-ACCOUNT is unbound.
[Condition of type UNBOUND-VARIABLE]

我尝试了我能想到的所有其他变体slot-value 'balance :documentation 'documentation bank-account and *account*我能想到但是在学习如何访问:defclass插槽的文档时遇到了很多不同的错误 非常感谢

编辑: @Rainer Joswig似乎只是在我进入repl的defclass之后才工作...我希望有一种方式,如果我在库中有一个设置的defclass或者我可以运行命令并访问doc。 。他们的方式你发布,但如果我在defclass后的repl运行其他东西....当我运行这4行代码时我得到一个错误....我试过像(文档(slot-value 帐户) '余额)t)我在我的帖子中运行了我的初始化实例和我的defparam 帐户但得到了错误....你能建议一种方法来简化文档访问。

1 个答案:

答案 0 :(得分:2)

这在Common Lisp标准中没有定义。不幸的是,这也不是初学者的领域。

实现可以提供访问插槽的文档字符串的方法。

LispWorks示例

CL-USER 23 > (defclass foo ()
               ((bar :documentation "this is slot bar in class foo")))
#<STANDARD-CLASS FOO 40200032C3>

CL-USER 24 > (class-slots *)
(#<STANDARD-EFFECTIVE-SLOT-DEFINITION BAR 4020004803>)

CL-USER 25 > (first *)
#<STANDARD-EFFECTIVE-SLOT-DEFINITION BAR 4020004803>

CL-USER 26 > (documentation * 'slot-definition)
"this is slot bar in class foo"

它也适用于Clozure CL。

对于SBCL,它的工作方式略有不同。

* (defclass foo ()
     ((bar :documentation "this is slot bar in class foo")))

#<STANDARD-CLASS FOO>


* (sb-mop:finalize-inheritance *)

NIL


* (sb-mop::class-slots **)

(#<SB-MOP:STANDARD-EFFECTIVE-SLOT-DEFINITION BAR>)


* (first *)

#<SB-MOP:STANDARD-EFFECTIVE-SLOT-DEFINITION BAR>


* (documentation * t)

"this is slot bar in class foo"