2009-07-06 23 views
5

Tôi có một số mã initialisation lisp:Tại sao phải 'đòi hỏi' được đánh giá trong một biểu thức riêng biệt để sử dụng của gói

(eval-when (:compile-toplevel :load-toplevel :execute) 
    (require 'asdf)) 

(eval-when (:compile-toplevel :load-toplevel :execute) 
    (push #p"c\:\\lisp\\clsql-4.0.4\\" asdf:*central-registry*)) 

Tại sao phiên bản mà biên dịch, trong khi phiên bản này:

(eval-when (:compile-toplevel :load-toplevel :execute) 
    (require 'asdf) 
    (push #p"c\:\\lisp\\clsql-4.0.4\\" asdf:*central-registry*)) 

tạo ra một lỗi trong khi biên dịch tập tin trong dòng thứ 3, với asdf một gói không được công nhận?

Tôi đang sử dụng ccl và (yêu cầu 'asdf) được ghi nhận là đưa vào phiên bản ASDF tích hợp sẵn.

Trả lời

9

Sau đây có thể không chính xác trong một số chi tiết, nhưng nó là xấp xỉ như thế này:

Có bốn giai đoạn mà các Lisp "động cơ" đi qua: đọc thời gian, thời gian mở rộng vĩ mô, thời gian biên dịch, và thời gian chạy .

Mỗi biểu mẫu cấp cao nhất được đọc lần đầu tiên hoàn toàn. Đọc, tuy nhiên, liên quan đến việc giải quyết các biểu tượng tương ứng. Vì ASDF chưa được tải trong thời gian đọc của biểu mẫu eval-when, biểu tượng asdf:*central-registry* chưa thể được giải quyết và điều này tạo ra lỗi đã đọc được đề cập.

4

Xem câu trả lời của Svante.

Đôi khi bạn có thể muốn giải quyết vấn đề này. Sau đó, bạn cần tìm biểu tượng trong mã tại RUNTIME.

(push somepath (symbol-value (find-symbol "*CENTRAL-REGISTRY*" "ASDF"))) 

Mã trên có thể được sử dụng trực tiếp, vì ký hiệu asdf: * central-registry * không được sử dụng trực tiếp nhưng tra cứu thời gian chạy bằng tên biểu tượng và tên gói.

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