Como evitar avisos de compilador de bytes Unused lexical variable
em funções definidas usando macros expandidas para defun
?
Por exemplo, macro defun-rcirc-command
in
rcirc.el
usa a target
variável que não é usada por várias invocações.
Em Common Lisp eu posso usar a
ignorable
declaração: (declare (ignorable target))
.
Soluções ruins:
Adicione algo como
(setq target target)
a todos os usuáriosdefun-rcirc-command
que não usamtarget
: isso requer a modificação de muitas invocações de macro.Prefixar a variável ignorável com um sublinhado -
_target
- não ajuda porque_
significaignore
, nãoignorable
, ou seja, quando é usado, eu entendovariable '_target' not left unused
.
compilation
warning
sds
fonte
fonte
(ignore VAR)
argumento para todos os argumentos antes da expansão @ body, que provavelmente silenciará os erros.Respostas:
O jeito que eu fiz isso até agora é adicionar uma chamada da forma
Essa chamada de função será otimizada, mas antes disso o compilador ainda contará como um uso, para que o aviso "não utilizado" não seja acionado.
fonte
Observando o código, parece que o destino não se destina a ser uma variável global, mas passou para a função criada quando é chamada. Se for esse o caso, é melhor criá-lo como um símbolo local para a macro. Um exemplo simples de macro que cria uma função que aceita um argumento e adiciona 10 a ele:
Chamando
resultará em uma função chamada hamster que aceita um argumento.
Então você pode ligar
e ele retornará
15
.O truque é criar um novo símbolo que atuará como argumento para a nova função.
EDITAR:
Eu sempre vi que, se você estiver se referindo ao símbolo gerado na expressão do corpo passada, inclua o nome na chamada como:
Que então transforma as chamadas em:
Onde
que retorna
30
eretorna
40
.É certo que isso sempre me incomoda quando escrevo macros dessa maneira, até observar o uso em que parece que um parâmetro é declarado e usado posteriormente.
fonte
target
. IOW, sua excelente sugestão não é aplicável neste caso específico.