2013-02-11 60 views

Trả lời

25

Chúng là symbols, không phải keywords.

  1. proclaim tên một hàm để làm toàn cầudeclarations. Bạn nên sử dụng declaim thay thế bất cứ khi nào có thể.

  2. declaim tên một vĩ mô để làm tờ khai toàn cầu (như proclaim) mà cũng có hiệu quả trong việc thời gian biên dịch.

  3. declare chỉ là một biểu tượng (ig, nó không đặt tên cho một chức năng, vĩ mô, hoặc nhà điều hành đặc biệt) để làm tờ khai địa phương vào đầu một số hình thức (bạn có thể xem nó như là một yếu tố của cú pháp của các biểu mẫu đó).

Vì vậy, hai cái đầu tiên ảnh hưởng đến global environment và cái cuối cùng ảnh hưởng đến địa phương.

declaim được ưa chuộng hơn proclaim bởi vì nó có một hiệu lực ngay trong môi trường biên soạn:

Mặc dù việc thực hiện của một hình thức proclaim có tác dụng mà có thể ảnh hưởng đến biên soạn, trình biên dịch không thực hiện bất kỳ nỗ lực để công nhận và xử lý đặc biệt các biểu mẫu công bố. Một công bố như sau đây, ngay cả khi một hình thức cấp cao nhất, không có bất kỳ tác dụng cho đến khi nó được thực thi:

(proclaim '(special *x*))

Nếu tác dụng phụ thời gian biên dịch được mong muốn, eval-when có thể hữu ích. Ví dụ:

(eval-when (:execute :compile-toplevel :load-toplevel) (proclaim '(special *x*)))

Trong hầu hết các trường hợp này, tuy nhiên, nó là preferrable sử dụng declaim cho mục đích này.

Tức là, nếu mã của bạn là

(proclaim '(special *x*)) 
(defun foo() (print *x*)) 

trình biên dịch sẽ phàn nàn rằng foo đọc một không rõ biến đặc biệt *x*, khi

(declaim (special *x*)) 
(defun foo() (print *x*)) 

sẽ gây ra không có cảnh báo.

PS.Nếu bạn đang tự hỏi tại sao CL thậm chí có proclaim: trước tiên, trước đây nó ở đó trước declaim và thứ hai, proclaim đơn giản và hữu ích hơn trong các macro.

+1

Cảm ơn bạn sds! Bạn có thể làm rõ sự khác biệt giữa 'proclaim' và' declaim'? Tôi đã thay đổi từ "từ khóa" trong câu hỏi của tôi, nó đã gây nhầm lẫn. Tôi đang cố che giấu một cách rõ ràng loại biểu tượng, nhưng biểu tượng chữ cũng tốt. – tuscland

+0

Sự khác biệt giữa chúng chỉ là: một là một hàm và, thông thường, không có hiệu lực tại thời gian biên dịch, còn cách khác là macro ảnh hưởng đến môi trường biên dịch. Bạn thực sự cần phải đọc spec để biết chi tiết. – sds

+0

Được rồi, tôi hiểu ngay bây giờ, cảm ơn. Thành thật mà nói [Hyperspec] (http://clhs.lisp.se/Body/f_procla.htm) là một chút khó hiểu, nhưng tôi sẽ cố gắng đề cập đến nó trong tương lai. – tuscland