加载指定错误形式的文件,但得到错误
Loading a file that specifies an error form, but getting the error
我正在尝试使用 (SBCL) Common Lisp 编写一个小游戏,使用 Quickload 和 ASDF 来定义和管理依赖项。它使用 CLOS,所以我在 project
中有一个名为 classes
的目录,其中有一个文件 locatable.cl
.
LOCATABLE class 的 defclass
形式需要一个 LOCATOR 参数,所以我有一行:
:initform (error "Must supply a locator parameter for this class.")
每当我尝试加载此文件或 quickload
系统时,我都会收到上述错误 ("Must supply a locator parameter for this class")。因为我试图定义一个系统而不是创建 class 的任何实例,所以我不明白为什么我会得到这个。如果我注释掉错误行,一切都会正常加载,但我被引导相信我拥有它的方式是要求插槽使用 :initval
的标准方式。
你如何定义这样的东西,以便你可以加载 file/make 系统定义而不实际发出错误信号?
这是 class -
(defclass locatable ()
((zone
:accessor zone
:initform nil)
(locator
:initarg :locator
:initform (error "Must supply a locator parameter for this class.")
:allocation :class
:accessor locator)))
更新:我在 REPL 中输入了表单,但出现了同样的错误。出于好奇,我又输入了两次,第一次是 :initform ""
,然后是错误形式。它接受了第一种形式,并且没有抱怨第二种形式,所以这个问题似乎没有发生在 re-definition.
(defclass locatable ()
((zone
:accessor zone
:initform nil)
(locator
:initarg :locator
:initform (error "Must supply a locator parameter for this class.")
:allocation :class
:accessor locator)))
插槽 locator
在 class 中共享。它将以某种方式在 class 对象中分配。 DEFCLASS
表单创建了这个 class 对象。因此,插槽 locator
通常会在创建和初始化 class 对象时进行初始化。在创建 class 的第一个实例之前的方式。
LispWorks 回溯
CL-USER 50 : 1 > :b
Call to CLOS::CLASS-REDEFINITION-LOCK-DEBUGGER-WRAPPER
Call to INVOKE-DEBUGGER
Call to ERROR
Call to (METHOD CLOS::COMPUTE-CLASS-SLOT-CONSES (STANDARD-CLASS))
Call to (METHOD SHARED-INITIALIZE :AFTER (STANDARD-CLASS T)) ; <--
Call to CLOS::ENSURE-CLASS-USING-CLASS-INTERNAL
Call to (METHOD CLOS:ENSURE-CLASS-USING-CLASS (CLASS T))
Call to CLOS::ENSURE-CLASS-WITHOUT-LOD
Call to LET
Call to LET
Call to EVAL
Call to CAPI::CAPI-TOP-LEVEL-FUNCTION
Call to CAPI::INTERACTIVE-PANE-TOP-LOOP
Call to MP::PROCESS-SG-FUNCTION
如您所见,在 class 对象上调用 SHARED-INITIALIZE
,然后初始化共享槽。
我也不认为像这样调用 error
应该在用户代码中完成。您可能会找到一种更好的方法来检查是否缺少 initargs。
我正在尝试使用 (SBCL) Common Lisp 编写一个小游戏,使用 Quickload 和 ASDF 来定义和管理依赖项。它使用 CLOS,所以我在 project
中有一个名为 classes
的目录,其中有一个文件 locatable.cl
.
LOCATABLE class 的 defclass
形式需要一个 LOCATOR 参数,所以我有一行:
:initform (error "Must supply a locator parameter for this class.")
每当我尝试加载此文件或 quickload
系统时,我都会收到上述错误 ("Must supply a locator parameter for this class")。因为我试图定义一个系统而不是创建 class 的任何实例,所以我不明白为什么我会得到这个。如果我注释掉错误行,一切都会正常加载,但我被引导相信我拥有它的方式是要求插槽使用 :initval
的标准方式。
你如何定义这样的东西,以便你可以加载 file/make 系统定义而不实际发出错误信号?
这是 class -
(defclass locatable ()
((zone
:accessor zone
:initform nil)
(locator
:initarg :locator
:initform (error "Must supply a locator parameter for this class.")
:allocation :class
:accessor locator)))
更新:我在 REPL 中输入了表单,但出现了同样的错误。出于好奇,我又输入了两次,第一次是 :initform ""
,然后是错误形式。它接受了第一种形式,并且没有抱怨第二种形式,所以这个问题似乎没有发生在 re-definition.
(defclass locatable ()
((zone
:accessor zone
:initform nil)
(locator
:initarg :locator
:initform (error "Must supply a locator parameter for this class.")
:allocation :class
:accessor locator)))
插槽 locator
在 class 中共享。它将以某种方式在 class 对象中分配。 DEFCLASS
表单创建了这个 class 对象。因此,插槽 locator
通常会在创建和初始化 class 对象时进行初始化。在创建 class 的第一个实例之前的方式。
LispWorks 回溯
CL-USER 50 : 1 > :b
Call to CLOS::CLASS-REDEFINITION-LOCK-DEBUGGER-WRAPPER
Call to INVOKE-DEBUGGER
Call to ERROR
Call to (METHOD CLOS::COMPUTE-CLASS-SLOT-CONSES (STANDARD-CLASS))
Call to (METHOD SHARED-INITIALIZE :AFTER (STANDARD-CLASS T)) ; <--
Call to CLOS::ENSURE-CLASS-USING-CLASS-INTERNAL
Call to (METHOD CLOS:ENSURE-CLASS-USING-CLASS (CLASS T))
Call to CLOS::ENSURE-CLASS-WITHOUT-LOD
Call to LET
Call to LET
Call to EVAL
Call to CAPI::CAPI-TOP-LEVEL-FUNCTION
Call to CAPI::INTERACTIVE-PANE-TOP-LOOP
Call to MP::PROCESS-SG-FUNCTION
如您所见,在 class 对象上调用 SHARED-INITIALIZE
,然后初始化共享槽。
我也不认为像这样调用 error
应该在用户代码中完成。您可能会找到一种更好的方法来检查是否缺少 initargs。