你能解释一下这三个符号之间的proclaim
区别declaim
吗declare
?
问问题
4988 次
1 回答
35
declaim
比它更可取,因为它在编译环境proclaim
中具有立竿见影的效果:
尽管
proclaim
表单的执行具有可能影响编译的效果,但编译器不会尝试识别和专门处理声明表单。诸如以下的声明,即使是顶级形式,在执行之前也不会产生任何影响:
(proclaim '(special *x*))
如果需要编译时副作用,
eval-when
可能会有用。例如:
(eval-when (:execute :compile-toplevel :load-toplevel) (proclaim '(special *x*)))
但是,在大多数此类情况下,最好将其
declaim
用于此目的。
即,如果您的代码是
(proclaim '(special *x*))
(defun foo () (print *x*))
编译器会抱怨foo
读取了一个未知的特殊变量*x*
,而
(declaim (special *x*))
(defun foo () (print *x*))
不会引起任何警告。
附言。如果您想知道为什么 CL 甚至有proclaim
:首先,它在历史上以前就存在declaim
,其次,proclaim
在宏中更简单且更有用。
于 2013-02-11T16:12:57.733 回答