宣告,声明,宣布

时间:2013-02-11 14:14:23

标签: lisp common-lisp

您能解释三个符号proclaimdeclaimdeclare之间的差异吗?

1 个答案:

答案 0 :(得分:26)

它们是symbols,而不是keywords

  1. proclaim为{em>全球 function命名declarations。您应该尽可能使用declaim

  2. declaimmacro命名为全球 declarations(如proclaim),这些内容在编译时也有效-time

  3. declare只是一个symbol(ig,它没有命名functionmacrospecial operator)来制作一些表单开头的> local declarations(您可以将其视为这些表单的语法元素)。

  4. 因此,前两个影响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在宏中更简单,更有用。