什么时候使用initform?

Sha*_*ter 9 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))))
Run Code Online (Sandbox Code Playgroud)

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

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

Rai*_*wig 4

通常,人们会使用 :initform 为槽赋予一些默认值。使用 defclass 不能简单地基于其他槽来计算 initforms。还有其他复杂的情况,因此 :initform 应该用于简单的表单。

例子

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

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

  • 将对象中的“关键功能”槽设置为#'identity

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

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