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

abo*_*abo 4 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*) +)]...}
Run Code Online (Sandbox Code Playgroud)

所以arg列表:arglists不像其他符号那样,但是在:forms.在Clojure中有这样的任何其他符号吗?

A. *_*ebb 5

其他例子是

let let*
letfn letfn*
loop loop*
Run Code Online (Sandbox Code Playgroud)

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

Clojure的文档将特殊形式定义为"执行核心操作的Clojure内置的原语".但是,如果适用于文档的特殊表格列表,这实际上意味着不太严格适用于他们的非加星标助手.

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