Lisp 什么时候使用initform?

Lisp 什么时候使用initform?,lisp,common-lisp,clos,Lisp,Common Lisp,Clos,我正在组织一个关于分子动力学的课程,如下所示: (defclass %atom (particle) ((name :initarg :name :initform (error "Every atom in the system must have a name!")) (mass :accessor mass :initarg :mass :initform (getmass name)) (charge :accessor charge :initarg :charge :

我正在组织一个关于分子动力学的课程,如下所示:

(defclass %atom (particle)
  ((name :initarg :name :initform (error "Every atom in the system must have a name!"))
   (mass :accessor mass :initarg :mass :initform (getmass name))
   (charge :accessor charge :initarg :charge :initform (getcharge name))))
起初我以为我可以用initform(即(getmass name))引用类定义中的其他插槽,但结果证明这是不真实的(或者是真的?!?)。相反,我被告知初始化实例将是放置所有初始化内容的地方。。。很公平


那么,我的问题是:何时使用initform?惯用的偏好是什么?如上所述,我看到它用于生成(错误“…”)代码,并且在未提供:initarg时初始化默认参数。但这两种方法都可以很容易地放入initialize实例中,并且在那个里可能更有意义。是否有一种特殊的方法:通常使用initform?

为了使事情更加复杂,还有class选项


就我个人而言,我使用
:default initargs
:initform
作为快捷方式,当不需要
初始化实例的after方法的全部功能时,以及
:initform
当插槽没有
:initarg

时,通常会使用:initform给插槽一些默认值。使用defclass不能简单地基于其他插槽计算initforms。还有其他复杂情况,因此:initform应该用于简单表单

例子

  • 将三维矢量对象的z槽设置为0.0

  • 将屏幕对象中的窗口列表设置为零

  • 将对象中的“键函数”槽设置为#“标识”

  • 将错误中的“报告字符串”槽设置为“发生错误”

任何其他更复杂的槽值设置都应该在一个方法中完成。如果需要在生成实例后自动设置对象,请使用:after方法初始化实例