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

时间:2015-11-08 12:18:32

标签: lisp clisp

我有两个文件,一个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既未被声明也未被约束,它将被视为已被宣布为特殊。

我该如何解决这个问题?

由于

1 个答案:

答案 0 :(得分:0)

从HyperSpec中引用defconstant

  

如果defconstant表单显示为顶级表单,则编译器必须识别该名称是常量变量。实现可以选择在编译时,加载时间或两者中评估值 - 形式

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

添加eval-when应解决此问题:

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

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