Bạn có thể giải thích sự khác biệt giữa ba biểu tượng proclaim
, declaim
và declare
?Tuyên bố, tuyên bố, tuyên bố
Trả lời
Chúng là symbols, không phải keywords.
proclaim
tên một hàm để làm toàn cầudeclarations. Bạn nên sử dụngdeclaim
thay thế bất cứ khi nào có thể.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.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. IF Tuyên bố nhiều điều kiện, cùng một tuyên bố
- 2. WPF DialogResult tuyên bố?
- 3. Tuyên bố Sql - goto
- 4. Tuyên bố GTK
- 5. Tuyên bố lệnh delphi
- 6. DBNull nếu tuyên bố
- 7. Bootstrap Function Tuyên bố
- 8. Tuyên bố chèn Mysqli
- 9. C# Tuyên bố rỗng
- 10. awk HOẶC tuyên bố
- 11. Tuyên bố biến Python
- 12. Biểu/Tuyên Bố
- 13. Jinja2 Nếu tuyên bố
- 14. Tuyên bố Khóa C#
- 15. ORACLE IIF Tuyên Bố
- 16. List.AddRange tuyên bố nội tuyến
- 17. Các do-while tuyên bố
- 18. switch() sử dụng tuyên bố
- 19. Nơi nhập khẩu tuyên bố
- 20. PHP Tuyên Bố Giải thích
- 21. Tuyên bố ngầm của luaL_openlibs
- 22. Tuyên bố CASE của DB2
- 23. switch tuyên bố trong LINQ
- 24. Tuyên bố Foreach trong listbox
- 25. SELECT tuyên bố trong JAVA
- 26. Tuyên bố chuyển đổi Java
- 27. Tuyên bố ifelse lồng nhau
- 28. Tuyên bố chuyển đổi Perl
- 29. Tuyên bố chuyển đổi JavaScript
- 30. LINQ Nếu Bản Tuyên Bố
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
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
Đượ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