8

我正在为分子动力学方面的一些工作组建一个班级,如下所示:

(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 名称)来引用类定义中的其他插槽 - 但事实证明这是不正确的(或者是这样吗?!?)。相反,我被告知 initialize-instance 将是放置所有初始化内容的地方......足够公平。

那么,我的问题是什么时候使用 :initform ?惯用的偏好是什么?我已经看到它如上所述用于生成(错误“...”)代码,并且还用于在未提供 :initarg 时初始化默认参数。但是这两个都可以很容易地适应初始化实例,并且在那里可能更有意义。有没有特别的方法 :initform 通常被使用?

4

2 回答 2

4

通常人们会使用 :initform 给一个插槽一些默认值。使用 defclass 不能简单地基于其他插槽计算 initforms。还有其他复杂性,所以 :initform 应该用于简单的表单。

例子

  • 将 3d 矢量对象的 z 槽设置为 0.0

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

  • 将对象中的 'key function' 槽设置为 #'identity

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

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

于 2009-11-07T09:18:44.233 回答
2

为了使事情更复杂一点,还有类选项:default-initargs

就我个人而言:default-initargs,当不需要:initform后置方法的全部功能并且插槽没有.initialize-instance:initform:initarg

于 2009-11-05T20:46:18.473 回答