Come posso dichiarare una variabile ignorabile?


10

Come evitare gli avvisi del compilatore di byte Unused lexical variablenelle funzioni definite utilizzando le macro che si espandono in defun?

Ad esempio, macro defun-rcirc-commandin rcirc.el utilizza la targetvariabile che non viene utilizzata da più invocazioni.

In Common Lisp posso usare il ignorable dichiarazione: (declare (ignorable target)).

Soluzioni sbagliate:

  • Aggiungi qualcosa di simile (setq target target)a tutti gli utenti defun-rcirc-commandche non usano target: ciò richiede la modifica di molte invocazioni di macro.

  • Il prefisso della variabile ignorabile con un trattino basso - _target- non aiuta perché _significa ignore, non ignorable, cioè, quando viene usato, ottengo variable '_target' not left unused.


Il prefisso con un trattino basso dovrebbe farlo.
politza,

@politza: _ significa ignorare, non ignorabile
sds

1
Vuoi modificare la macro per risolvere il problema? Probabilmente potresti semplicemente mettere un (ignore VAR)per ogni argomento defun prima dell'espansione, @ body che probabilmente silenzierà gli errori.
Jordon Biondo,

Risposte:


13

Il modo in cui l'ho fatto finora è quello di aggiungere una chiamata alla forma

(ignore <var>)

Questa chiamata di funzione verrà ottimizzata, ma prima il compilatore continuerà a conteggiarla come un utilizzo, quindi l'avviso "non utilizzato" non verrà attivato.


-1

Guardando il codice, sembra che target non sia destinato a essere una variabile globale ma passato alla funzione creata quando viene chiamato. In tal caso, è meglio crearlo come simbolo locale della macro. Un semplice esempio di una macro che crea una funzione che accetta un argomento e ne aggiunge 10:

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

chiamata

(xxx hamster)

si tradurrà in una funzione chiamata criceto che accetta un argomento.

Quindi puoi chiamare

(hamster 5)

e tornerà 15.

Il trucco è creare un nuovo simbolo che fungerà da argomento per la nuova funzione.

MODIFICARE:

Ho sempre visto che se ti riferisci al simbolo generato nell'espressione del corpo passata, includi il nome nella chiamata come:

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

Che poi trasforma le chiamate in:

(xxx hamster target (+ target 20))

dove

(hamster)

che ritorna 30e

(hamster 20)

ritorna 40.

Certo, questo mi dà sempre fastidio quando scrivo macro in questo modo fino a quando non guardo l'uso in cui appare che un parametro viene dichiarato e successivamente utilizzato.


2
Il corpo della funzione viene passato alla macro e deve poter fare riferimento target. IOW, il tuo eccellente suggerimento non è applicabile in questo caso specifico.
sds
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.