2013-08-14 18 views
6

Non so se dipende dall'implementazione. Solo nel caso è importante, sto usando Corman Lisp 3.0Che cos'è "Variabile non utilizzata G **** nella funzione anonima"?

Quando faccio qualcosa di simile:

(loop for v being the hash-values of *my-hash-table* 
    when (> v 1) sum v) 

ottengo due avvertimenti:

;;; Warning: Unused variable G9063 in anonymous function 
;;; Warning: Unused variable G9062 in anonymous function 

Con il numero di G cambiare ogni tempo.

Il risultato è corretto però. Cosa vogliono dire? Perché appaiono? Suppongo che potrebbe esserci un qualche tipo di abuso di sintassi loop, che porta a questi avvertimenti, ma non riesco a vederlo.

risposta

6

Corman Lisp non è stato aggiornato per anni. Le variabili inutilizzate G* sono probabilmente gensym s nell'espansione macro di loop. Prova

(macroexpand '(loop ...)) 

per vedere cosa memorizzano queste variabili.

+0

'(LET ((#: G9003 NIL) (V NIL) (#: G9000 WORD-COUNT) (#: G9002 NIL)) (WITH-HASH-TABLE-ITERATOR (#: G9001 #: G9000) (LET ((#: G9004 0)) (DICHIARARE (NUMERO NUMERO: G9004)) (BLOCCO NIL (LOOP :: LOOP-BODY NIL (NIL NIL (WHEN (NOT (MULTIPLE-VALUE-SETQ (#: G9003 #: G9002 V) (#: G9001))) (GO LOOP :: END-LOOP)) NIL) ((SE (> V 1) (SETQ #: G9004 (+ #: G9004 V)))) (NIL NIL (WHEN (NOT (MULTIPLE-VALUE-SETQ (#: G9003 #: G9002 V) (#: G9001))) (GO LOOP :: END-LOOP)) NIL) ((RETURN-FROM NIL #: G9004))))))) 'È difficile da leggere, ma suppongo che G9002 e G9003 siano ciò che sto cercando. Ha senso ora, grazie! – akalenuk

+1

@akalenuk Per facilitare la lettura, si potrebbe provare '(pprint (macroexpand '(loop ...)))'. L'ho fatto con il codice che hai incollato e ho ottenuto: http://paste.lisp.org/display/138466 (Ho dovuto modificare alcuni dei simboli, ad esempio 'loop :: end-loop' in' loop \: \: end-loop' dato che SBCL non ha un pacchetto 'ciclo', ma è fondamentalmente lo stesso.) –