27

你能解释一下这三个符号之间的proclaim区别declaimdeclare

4

1 回答 1

35

它们是符号,而不是关键字

  1. proclaim命名一个用于进行全局声明的函数。您应该尽可能使用。 declaim

  2. declaim命名一个来进行全局 声明(如),这在编译时proclaim也有效。

  3. declare只是一个符号(即,它没有命名函数特殊运算符),用于在某些形式的开头进行局部 声明(您可以将其视为这些形式的语法元素)。

所以,前两个影响全局环境,最后一个是本地的。

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 回答