Comment puis-je éviter les avertissements du compilateur d'octets Unused lexical variable
dans les fonctions définies à l'aide de macros développées en defun
?
Par exemple, macro defun-rcirc-command
in
rcirc.el
utilise la target
variable qui n'est pas utilisée par plusieurs appels.
En Common Lisp je peux utiliser la
ignorable
déclaration: (declare (ignorable target))
.
Mauvaises solutions:
Ajoutez quelque chose comme
(setq target target)
à tous les utilisateursdefun-rcirc-command
qui n'utilisent pastarget
: cela nécessite de modifier de nombreuses invocations de macro.Préfixer la variable ignorable avec un trait de soulignement -
_target
- n'aide pas parce que cela_
signifieignore
, nonignorable
, c'est-à-dire, quand elle est utilisée, je reçoisvariable '_target' not left unused
.
(ignore VAR)
argument pour chaque defun avant l'extension, @ body, ce qui réduira probablement au silence les erreurs.Réponses:
La façon dont je l'ai fait jusqu'à présent est d'ajouter un appel de la forme
Cet appel de fonction sera optimisé, mais avant cela, le compilateur le considérera toujours comme une utilisation, donc l'avertissement "inutilisé" ne sera pas déclenché.
la source
En regardant le code, il apparaît que la cible n'est pas destinée à être une variable globale mais transmise à la fonction créée lors de son appel. Si tel est le cas, il est préférable de le créer en tant que symbole local de la macro. Un exemple simple d'une macro qui crée une fonction qui accepte un argument et y ajoute 10:
Appel
entraînera une fonction nommée hamster qui accepte un argument.
Ensuite, vous pouvez appeler
et il reviendra
15
.L'astuce consiste à créer un nouveau symbole qui servira d'argument à la nouvelle fonction.
ÉDITER:
J'ai toujours vu que si vous faites référence au symbole généré dans l'expression corporelle transmise, vous incluez le nom dans l'appel comme:
Ce qui transforme ensuite les appels en:
où
qui revient
30
etretourne
40
.Certes, cela me dérange toujours lorsque j'écris des macros de cette façon jusqu'à ce que je regarde l'utilisation dans laquelle il apparaît qu'un paramètre est déclaré et utilisé plus tard.
la source
target
. IOW, votre excellente suggestion n'est pas applicable dans ce cas spécifique.