Je veux obtenir l'effet d'une variable statique en utilisant defun
inside of let
avec une liaison lexicale pour créer une fermeture. Cependant, lors de la compilation d'octets du fichier, je reçois un avertissement. Suis-je en train de faire quelque chose de mal, ou sinon, existe-t-il un moyen de supprimer cet avertissement?
J'ai créé un MCVE:
;; -*- lexical-binding: t -*-
(let ((count 0))
(defun increase-count ()
(interactive)
(setq count (1+ count))
(message "Count is: %d" count))
;; The warning happens here.
(increase-count))
Le code fonctionne comme prévu: la fonction increase-count
affiche "Count is: n" où n augmente à chaque appel. Cependant, lors de la compilation d'octets de ce fichier, j'obtiens l'avertissement suivant:
In end of data:
mcve.el:11:1:Warning: the function ‘increase-count’ is not known to be
defined.
Il me semble que cela increase-count
devrait toujours être défini avant d'être appelé à la fin du let-block. Ce n'est pas le cas?
byte-compilation
lexical-scoping
defun
lexical-binding
Will Kunkel
la source
la source
defun
ne fait pas ce que vous pensez qu'il fait, il crée toujours une définition de haut niveau. Elisp n'est après tout pas Scheme ...Réponses:
La façon dont le compilateur d'octets décide si une fonction sera définie ou non est très "naïve" et est dupe même dans votre cas "évident". Mais vous pouvez l'écrire d'une manière qui permet au compilateur de comprendre ce qui se passe:
Bien sûr, encore mieux serait d'améliorer la logique du compilateur d'octets: les correctifs sont les bienvenus pour cela.
la source
Pour supprimer l'avertissement du compilateur d'octets, essayez de l'ajouter avant votre code, en commençant dans la colonne 0 (à l'extrême gauche):
C-h f declare-function
vous indique:la source
FILEONLY
argument non nul est-il nécessaire pour le cas d'espèce? BTW, j'aurais donné la même réponse ;-).FILEONLY
ne semblait pas être nécessaire ici, pour moi. Ce qui semblerait indiquer quecheck-declare
reconnaît lef
etg
defuns.f
etg
n'a de sens que dans le contexte d' emacs.stackexchange.com/q/39439 ?FILEONLY
cela ne semblait pas être nécessaire ici, pour moi. Ce qui semble indiquer quecheck-declare
reconnaît leincrease-count
defun. ;-)Je crois que le fait de placer la définition en question à l'intérieur
eval-and-compile
permettrait également, superficiellement, d' obtenir le même résultat que dans la bonne réponse de Stefan :Je connais cependant à peine les subtilités de l'utilisation
eval-and-compile
et, en outre, je ne m'attends pas à ce que cette approche soit en aucune façon supérieure.la source