医生说它是一种特殊的形式,虽然我看到了 它被定义为一个宏。
同样(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中有这样的任何其他符号吗?
答案 0 :(得分:5)
其他例子是
let let*
letfn letfn*
loop loop*
加星标的版本是编译器级别的真正特殊符号,即语言的基元。非加星标的版本是在Clojure中定义的var
。这些是较低级别已加星标的版本的帮助程序,可以在更方便的级别(例如Clojure中)执行解构,参数检查和文档等操作。
Clojure的文档defines special forms非常严格地说是“执行核心操作的Clojure内置的原语”。但是,如果适用于文档的list of special forms,这实际上意味着不太严格适用于他们的非加星标助手。
这只是语义。在其他地方,其他地方,你会看到用于谈论改变正常评估规则的任何形式的特殊形式。因此,从这个意义上讲,您可以将宏and
称为特殊形式,因为它会进行短路评估。在Clojure and
中没有标记或记录,这与保留原语或其助手的术语一致。