2015-11-08 1 views
0

J'ai deux fichiers, un fichier utils où j'ai défini beaucoup de constantes, comme celui-ci:Impossible d'accéder à des constantes définies dans un autre fichier

(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)))) 

Et un autre fichier où je définir les fonctions. Je charge ce fichier comme ceci:

(load "utils.fas") 

Cependant, chaque fois que j'essaie de les utiliser, j'ai un avertissement:

AVERTISSEMENT: en Acções en lignes 121..174: PECA-L1 est déclaré ni lié, il sera traité comme s'il était déclaré SPECIAL.

Comment puis-je résoudre ce problème?

Merci

Répondre

0

Je cite la hyperspec à propos defconstant:

Si une forme defconstant apparaît comme une forme de haut niveau, le compilateur doit reconnaître que les noms de nom d'une variable constante. Une implémentation peut choisir d'évaluer le formulaire de valeur au moment de la compilation, du chargement ou des deux.

Je ne suis pas trop familier avec le concept moi-même, mais je suppose que votre application n'évalue que les constantes pendant la compilation, c'est lorsque votre fichier est compilé. En conséquence, les références dans ce même fichier à ces constantes fonctionneront. Mais lorsque vous chargez le fichier compilé, les définitions des constantes ne sont pas évaluées, vous ne pouvez donc pas y accéder après le chargement.

Ajout d'un eval-when devrait résoudre ce problème:

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

Notez cependant que l'utilisation clisp 2.49 je ne peux pas reproduire votre problème.