2013-08-14 39 views
6

Tôi không biết liệu nó có phụ thuộc vào việc triển khai hay không. Chỉ trong trường hợp vấn đề, tôi đang sử dụng Corman Lisp 3,0"Biến không sử dụng G **** trong chức năng ẩn danh" là gì?

Khi tôi làm một cái gì đó như thế này:

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

tôi nhận được hai cảnh báo:

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

Với số lượng G thay đổi mỗi thời gian.

Kết quả là chính xác. Có ý nghĩa gì? Tại sao chúng xuất hiện? Tôi cho rằng có thể có một số loại lạm dụng cú pháp loop, dẫn đến những cảnh báo này, nhưng tôi không thấy nó.

Trả lời

6

Corman Lisp chưa được cập nhật trong nhiều năm. Các biến không sử dụng G* có thể là gensym s trong việc mở rộng macro của loop. Hãy thử

(macroexpand '(loop ...)) 

để xem những biến này lưu trữ.

+0

'(LET ((#: G9003 NIL) (V NIL) (#: G9000 WORD-COUNT) (#: G9002 NIL)) (WITH-HASH-TABLE-ITERATOR (#: G9001 #: G9000) (LET ((#: G9004 0)) (DECLARE (LOẠI SỐ #: G9004)) (BLOCK NIL (LOOP :: LOOP-BODY NIL (NIL NIL (KHI NÀO (KHÔNG (MULTIPLE-VALUE-SETQ (#: G9003 #: G9002 V) (#: G9001))) (GO LOOP :: END-LOOP)) NIL ((IF (> V 1) (SETQ #: G9004 (+ #: G9004 V)))) (NIL NIL (WHEN (KHÔNG (MULTIPLE-VALUE-SETQ (#: G9003 #: G9002 V) (#: G9001))) (GO LOOP :: END-LOOP)) NIL) ((RETURN-FROM NIL #: G9004)))))))) "Nó rất khó đọc, nhưng tôi đoán G9002 và G9003 là những gì tôi đang tìm kiếm. Nó có ý nghĩa bây giờ, cảm ơn! – akalenuk

+1

@akalenuk Để đọc dễ dàng hơn, bạn có thể thử '(pprint (macroexpand '(vòng lặp ...)))'. Tôi đã làm điều đó với mã bạn dán, và có: http://paste.lisp.org/display/138466 (Tôi đã phải thay đổi một số biểu tượng, ví dụ, 'loop :: end-loop' thành' loop \: \: end-loop' vì SBCL không có gói 'loop', nhưng về cơ bản là giống nhau.) –

Các vấn đề liên quan