2013-08-14 6 views
6

Nie wiem, czy jest to zależne od implementacji. Tylko w przypadku, jest to ważne, używam Cormana Lisp 3,0Co to jest "Niewykorzystana zmienna G **** w anonimowej funkcji"?

Kiedy zrobić coś takiego:

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

mam dwa ostrzeżenia:

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

z numerem G zmienia każdy czas.

Wynik jest poprawny. Co mieli na myśli? Dlaczego się pojawiają? Przypuszczam, że może być jakieś niewłaściwe użycie składni, co prowadzi do tych ostrzeżeń, ale nie widzę tego.

Odpowiedz

6

Corman Lisp nie był aktualizowany od lat. Nieużywane zmienne G* są prawdopodobnie gensym s w rozszerzeniu makro o loop. Wypróbuj

(macroexpand '(loop ...)) 

, aby zobaczyć, co przechowują te zmienne.

+0

'(LET ((#: G9003 NIL) (V NIL) (#: G9000 WORD-COUNT) (#: G9002 NIL)) (Z-HASH-TABLE-ITERATOR (#: G9001 #: G9000) (LET ((#: G9004 0)) (DECLARE (TYP NUMERU NR: G9004)) (BLOKADA NIL (PĘTLA: LOOP-NÓŻ NIL (NIL NIL (GDY (NIE (WIELOFUNKCYJNY-SETQ (#: G9003 #: G9002 V) (#: G9001))) (GO LOOP :: END-LOOP)) NIL) ((JEŻELI (> V 1) (SETQ #: G9004 (+ #: G9004 V)))) (NIL NIL (GDY (NIE (MULTIPLE-VALUE-SETQ (#: G9003 #: G9002 V) (#: G9001))) (GO LOOP :: END-LOOP)) NIL) ((RETURN-FROM NIL #: G9004))))))) 'Nie jest to trudne do odczytania, ale myślę, że szukam G9002 i G9003. Teraz ma sens, dzięki! – akalenuk

+1

@akalenuk Dla łatwiejszego czytania możesz wypróbować '(pprint (macroexpand '(loop ...)))'. Zrobiłem to za pomocą wklejonego kodu i otrzymałem: http://paste.lisp.org/display/138466 (Musiałem zmienić niektóre z symboli, np. 'Loop :: end-loop' na' loop \: \: koniec pętli', ponieważ SBCL nie ma pakietu 'loop', ale zasadniczo jest taki sam.) –