sds*_*sds 27
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*))
Run Code Online (Sandbox Code Playgroud)
编译器会抱怨foo读取未知的特殊变量*x*,而
(declaim (special *x*))
(defun foo () (print *x*))
Run Code Online (Sandbox Code Playgroud)
不会引起警告.
PS.如果你想知道为什么CL甚至有proclaim:首先,历史上它曾经在那里declaim,第二,proclaim在宏中更简单和有用.