我有两个文件,一个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")
但是,每次我尝试使用它时都会收到警告:
警告:在第121..174行的ACCOES中:PECA-L1既未被声明也未被约束,它将被视为已被宣布为特殊。
我该如何解决这个问题?
由于
答案 0 :(得分:0)
从HyperSpec中引用defconstant
:
如果
defconstant
表单显示为顶级表单,则编译器必须识别该名称是常量变量。实现可以选择在编译时,加载时间或两者中评估值 - 形式。
我自己并不是很熟悉这个概念,但我猜你的实现只会在编译期间评估常量,即编译文件时。因此,同一文件中对这些常量的引用将起作用。但是,当您加载已编译的文件时,不会评估常量的定义,因此在加载后无法访问它们。
添加eval-when
应解决此问题:
(eval-when (:load-toplevel :compile-toplevel)
(defconstant +foo+ 'bar))
请注意,虽然使用clisp 2.49
我无法重现您的问题。