gpt4 book ai didi

common-lisp - OpenMCL Common Lisp 出现 "No MAKE-LOAD-FORM"错误

转载 作者:行者123 更新时间:2023-12-02 04:25:47 25 4
gpt4 key购买 nike

我正在尝试使用 SLIME 和 OpenMCL(现在称为 CCL)在 OS X 上运行 Paul Graham 的 ANSI Common Lisp 中的光线追踪代码。在该代码中,定义了一个常量,其值是一个结构体,当我在任何对象上调用 slime-compile-and-load-fileslime-compile-defun 时使用常量的函数时,我收到一条错误消息:

No MAKE-LOAD-FORM method is defined for #S(POINT :X 0 :Y 0 :Z 200) [Condition of type SIMPLE-ERROR]

我找到了a post解释并发症并 another one对此感到遗憾,但是需要在代码中添加什么来协商 OpenMCL 的这一方面?

最佳答案

当 STRUCTURE-OBJECT(和一些其他类型的对象)在 COMPILE-FILE 处理的代码中显示为文字、常量对象时,COMPILE-FILE 需要知道如何安排,当加载生成的二进制文件时,创建“等效”对象。 “等效”有许多可能的定义:有时,加载对象的组件与其他对象共享结构很重要,有时初始化以某种方式发生很重要,有时这些都不重要。为了确定如何重新创建常量对象,COMPILE-FILE 调用通用函数 MAKE-LOAD-FORM;此行为应该在任何 CL 引用或教程中进行描述。 (引用或教程还应注意,实现无法定义适用于 STRUCTURE-CLASS 或 STANDARD-CLASS 的所有实例的默认 MAKE-LOAD-FORM 方法,并且还应注意 MAKE-LOAD-FORM-SAVING -SLOTS 是一个方便的函数,可在 MAKE-LOAD-FORM 方法中用于初始化不需要复杂的对象,例如:

(defmethod make-load-form ((p point) &optional env)
(declare (ignore env))
(make-load-form-saving-slots p))

请注意,该方法必须在编译时定义,以便 COMPILE-FILE 可以调用它来确定如何保存常量 POINT 对象。

这些都不是 CCL 特定的。可能存在的问题是哪些事物是常量、文字对象,哪些事物不是。

代码如下:

(defconstant a-point (make-point :x 0 :y 0 :z 200))

(defun return-a-point () a-point)

编译器允许(但不要求)用 A-POINT 的值替换函数 RETURN-A-POINT 中对其的引用。 (如果编译器这样做,那就会意味着正在编译的代码中有一个文字/常量 POINT 对象,并且 COMPILE-FILE 需要调用 MAKE-LOAD-FORM 来确定应如何保存和加载该对象;如果编译器不执行此替换,则在此示例中不需要调用 MAKE-LOAD-FORM。)

实现是否进行这种替换取决于实现。该规范还没有指定 DEFCONSTANT 形式中的值形式是否在编译时、加载时或两者都计算,并指出必须(由用户)小心确保表达式始终计算为相同的值。

CCL 通常尝试在编译时评估 DEFCONSTANT 值形式,并且相当积极地用命名常量的值替换对它们的引用;在某些情况下,这意味着必须定义常量值的类的 MAKE-LOAD-FORM 方法。其他实现可能不太愿意对某些类型的对象进行这种替换。两种策略都是正确的,并且可移植代码无法假设正在遵循哪种策略(尽管据称可移植代码确实会做出这样的假设。)

对 DEFCONSTANT 定义的事物的不同处理似乎是此类事情最有可能的原因(意外调用 MAKE-LOAD-FORM ,没有人费心去定义)。人们可以通过以下方式以一种可移植的方式避免其中一些问题:

(defconstant a-point (make-point :x 0 :y 0 :z 200))

(defun return-a-point () (load-time-value (symbol-value 'a-point)))

这与简单地允许想要这样做的实现(如 CCL 所做的)进行常量替换具有类似的效果,但使用 LOAD-TIME-VALUE 将确保仅在加载时评估常量值时间(并且不会涉及 MAKE-LOAD-FORM。)

关于common-lisp - OpenMCL Common Lisp 出现 "No MAKE-LOAD-FORM"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/346695/

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