2014-05-13 4 views
4

J'écris un code à SBCL, et l'ordre de mes fonctions ne cesse de provoquer des avertissements du type suivant apparaissent lorsque je charge les fichiers dans le REPL:SBCL forward déclaration: possible?

;caught STYLE-WARNING: 
    undefined function: FOO 

FOO est le symbole de la fonction. Ceci est purement dû à la façon dont ils sont ordonnés dans mon fichier, car la fonction FOOest définie, juste avant la partie du code qui déclenche cet avertissement.

Maintenant, dans Clojure, qui est le Lisp que je connais, j'ai le formulaire declare, qui me permet de faire des déclarations anticipées pour éviter ce genre de problème. Y a-t-il quelque chose de similaire pour SBCL/Common Lisp en général?

Répondre

1

Voici ce que j'ai trouvé dans le manuel, section 4.1.1:

CL-USER> (defun foo (x) (bar x)) 
; in: DEFUN FOO 
;  (BAR X) 
; 
; caught STYLE-WARNING: 
; undefined function: BAR 
; 
; compilation unit finished 
; Undefined function: 
;  BAR 
; caught 1 STYLE-WARNING condition 
FOO 
CL-USER> (declaim (sb-ext:muffle-conditions style-warning)) 
; No value 
CL-USER> (defun baz (y) (quux y)) 
BAZ 

Ainsi, vous pouvez au moins réduire au silence les avertissements de style.

J'ai également réfléchi à la façon dont SBCL gère l'étape d'évaluation dans le REPL: il compile le code. Donc, je remis en marche le processus Lisp inférieur et couru « compiler région » sur les deux lignes suivantes:

(defun foo (x) (bar x)) 
(defun bar (y) (baz y)) 

et SBCL ne plaignais baz, mais pas bar. Donnez-vous des fonctions uniques à SBCL ou des morceaux plus grands?

+0

En général, je charge le fichier entier en utilisant '' (charge "foo.lisp") '' au premier niveau. Ces avertissements apparaissent la première fois que je charge un nouveau fichier. –

+1

Essayez '(fichier de compilation" foo.lisp ")' suivi de '(charger" foo.fasl ")'. Si vous exécutez emacs/slime en tant que frontal, Ctrl-c Ctrl-k le fait pour vous. –

1

Nous pouvons utiliser le « (déclament (ftype ...)) » pour que:

(declaim (ftype (function (integer list) t) ith)) 

(defun foo (xs) 
    (ith 0 xs)) 

(defun ith (n xs) 
    (nth n xs)) 

Tant la fonction « foo » et « vec » fonctionne très bien et il n'y a pas d'avertissement de style à ce sujet .

http://www.lispworks.com/documentation/HyperSpec/Body/d_ftype.htm