无法访问另一个文件中定义的常量

Can't access constants defined in another file

我有两个文件,一个 utils 文件,我在其中定义了很多常量,如下所示:

(defconstant peca-l0 (make-array (list 3 2) :initial-contents '((T T)(T nil)(T nil))))
(defconstant peca-l1 (make-array (list 2 3) :initial-contents '((T nil nil)(T T T))))
(defconstant peca-l2 (make-array (list 3 2) :initial-contents '((nil T)(nil T)(T T))))
(defconstant peca-l3 (make-array (list 2 3) :initial-contents '((T T T)(nil nil T))))

还有另一个我在其中定义函数的文件。我这样加载这个文件:

(load "utils.fas")

但是,每次我尝试使用它们时都会收到警告:

警告:在 ACCOES 中的第 121..174 行:PECA-L1 既未声明也未绑定,它将被视为声明为 SPECIAL。

我该如何解决这个问题?

谢谢

引用 HyperSpec 关于 defconstant:

If a defconstant form appears as a top level form, the compiler must recognize that name names a constant variable. An implementation may choose to evaluate the value-form at compile time, load time, or both.

我自己对这个概念不太熟悉,但我猜你的实现只在编译时计算常量,也就是编译文件时。因此,在同一个文件中对这些常量的引用将起作用。但是当您随后加载编译文件时,不会评估常量的定义,因此您无法在加载后访问它们。

添加 eval-when 应该可以解决这个问题:

(eval-when (:load-toplevel :compile-toplevel)
  (defconstant +foo+ 'bar))

请注意,使用 clisp 2.49 我无法重现您的问题。