Como declaro uma variável ignorável?

10

Como evitar avisos de compilador de bytes Unused lexical variableem funções definidas usando macros expandidas para defun?

Por exemplo, macro defun-rcirc-commandin rcirc.el usa a targetvariá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ários defun-rcirc-commandque não usam target: 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 _significa ignore, não ignorable, ou seja, quando é usado, eu entendo variable '_target' not left unused.

sds
fonte
O prefixo deles com um sublinhado deve fazer isso.
Politza # 16/15
@politza: _ meios ignorar, não ignorável
sds
1
Deseja modificar a macro para resolver o problema? Provavelmente, você pode colocar um (ignore VAR)argumento para todos os argumentos antes da expansão @ body, que provavelmente silenciará os erros.
Jordon Biondo

Respostas:

13

O jeito que eu fiz isso até agora é adicionar uma chamada da forma

(ignore <var>)

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.

Stefan
fonte
-1

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:

(defmacro xxx (name)  
  ""
  (let ((target (make-symbol "target")))
  `(defun ,name (,target) (+ 10 ,target))))

Chamando

(xxx hamster)

resultará em uma função chamada hamster que aceita um argumento.

Então você pode ligar

(hamster 5)

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:

(defmacro xxx (name t2 &rest body)  
  ""
  (let ((t2-arg (make-symbol "target")))
  `(defun ,name (&optional ,t2-arg) 
     (let ((,t2 (or ,t2-arg 10)))
       ,@body))))

Que então transforma as chamadas em:

(xxx hamster target (+ target 20))

Onde

(hamster)

que retorna 30e

(hamster 20)

retorna 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.

M Smith
fonte
2
O corpo da função é passado para a macro e deve ser capaz de se referir target. IOW, sua excelente sugestão não é aplicável neste caso específico.
sds