什么时候使用initform?

时间:2009-11-05 19:53:27

标签: 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 :initform (getcharge name))))

最初,我认为我可以某种方式使用initform(getmass名称)来引用类定义中的其他槽 - 但事实证明这是不真实的(或者它是什么?!?)。相反,我被告知初始化实例将是放置所有初始化内容的地方......足够公平。

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

2 个答案:

答案 0 :(得分:4)

通常会使用:initform为插槽提供一些默认值。使用defclass,无法仅根据其他插槽计算初始化。还有其他一些复杂因素,因此:initform应该用于简单的表单。

实施例

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

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

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

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

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

答案 1 :(得分:2)

为了使事情进一步复杂化,还有类选项:default-initargs

我个人使用:default-initargs:initform作为快捷方式,当不需要initialize-instance的后方法的全部功能时,:initform当插槽没有有一个:initarg