gpt4 book ai didi

lisp - 什么时候使用 initform?

转载 作者:太空宇宙 更新时间:2023-11-03 18:34:31 25 4
gpt4 key购买 nike

我正在为分子动力学的一些工作组建一个类(class),如下所示:

(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))))

最初我认为我可以通过初始化形式以某种方式引用类定义中的其他槽,即 (getmass name) - 但事实证明这是不正确的(或者是吗?!?)。相反,我被告知 initialize-instance 将是放置所有初始化内容的地方……很公平。

那么我的问题是,什么时候使用 :initform?惯用偏好是什么?我已经看到它像上面那样用于生成 (error "...") 代码,并且还用于在未提供 :initarg 时初始化默认参数。但是这两者都可以很容易地适应初始化实例,并且在那里可能更有意义。有没有什么特别的方式:initform 是普遍使用的?

最佳答案

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

例子

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

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

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

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

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

关于lisp - 什么时候使用 initform?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1683107/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com