我正在组建一个关于分子动力学的课程如下:
(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?
答案 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
。