您能解释三个符号proclaim
,declaim
和declare
之间的差异吗?
答案 0 :(得分:26)
proclaim
为{em>全球 function命名declarations。您应该尽可能使用declaim
。
declaim
将macro命名为全球 declarations(如proclaim
),这些内容在编译时也有效-time
declare
只是一个symbol(ig,它没有命名function,macro或special operator)来制作一些表单开头的> local declarations(您可以将其视为这些表单的语法元素)。
因此,前两个影响global environment,最后一个影响local。
declaim
优于proclaim
,因为它会立即影响compilation environment:
尽管执行
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*))
不会发出警告。
<强> PS 即可。如果你想知道为什么CL甚至有proclaim
:首先,历史上它在declaim
之前就存在了,第二,proclaim
在宏中更简单,更有用。