Clojure:`fn`是特殊符号,宏还是特殊形式?

时间:2014-02-01 12:13:52

标签: clojure

医生说它是一种特殊的形式,虽然我看到了 它被定义为一个宏。

同样(meta #'fn)同时:macro:special-form为真。

最后,(special-symbol? 'fn)false,但(special-symbol? 'fn*)true

有人可以为我清楚吗? 在Clojure中是否有任何其他奇怪的符号都是特殊形式和宏 而不是特殊符号?

还有一件事,它是迄今为止我见过的唯一可赎回的符号 有这个(meta #'fn)

{:arglists ([& sigs]),
 :forms [(fn name? [params*] exprs*) 
         (fn name? ([params*] exprs*) +)]...}

因此,arg列表不像:arglists那样在其他符号中,而是在:forms中。 在Clojure中有这样的任何其他符号吗?

1 个答案:

答案 0 :(得分:5)

其他例子是

let let*
letfn letfn*
loop loop*

加星标的版本是编译器级别的真正特殊符号,即语言的基元。非加星标的版本是在Clojure中定义的var。这些是较低级别已加星标的版本的帮助程序,可以在更方便的级别(例如Clojure中)执行解构,参数检查和文档等操作。

Clojure的文档defines special forms非常严格地说是“执行核心操作的Clojure内置的原语”。但是,如果适用于文档的list of special forms,这实际上意味着不太严格适用于他们的非加星标助手。

这只是语义。在其他地方,其他地方,你会看到用于谈论改变正常评估规则的任何形式的特殊形式。因此,从这个意义上讲,您可以将宏and称为特殊形式,因为它会进行短路评估。在Clojure and中没有标记或记录,这与保留原语或其助手的术语一致。

相关问题