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

4

文档说它是一种特殊形式,但我发现它被定义为宏。

另外,(meta #'fn):macro:special-form都为true。

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

有人能为我澄清一下吗? 在Clojure中是否还有其他既是特殊形式又是宏的奇怪符号? 而不是 special-symbol

还有一件事,这是我迄今为止见过的唯一可调用符号,它有这样的(meta #'fn):

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

因此,参数列表不像其他符号一样在:arglists中,而是在:forms中。Clojure中还有其他类似的符号吗?
1个回答

5
其他例子是:
let let*
letfn letfn*
loop loop*

星号版本是编译器级别的特殊符号,是语言的原语。非星号版本是在Clojure中定义的var。这些都是在更方便的层次上执行解构、参数检查和文档等操作的低级星号版本的帮助程序,即在Clojure中。
Clojure的文档defines special forms将其严格定义为“内置于Clojure中执行核心操作的基元”。但是,当适用于文档的list of special forms中的非星号辅助程序时,这实际上意味着应该少严格地应用它们。
这只是语义问题。在其他地方,其他lisp中,您会看到特殊形式用于谈论任何改变正常评估规则的形式。因此,在这种意义上,您会将宏and称为特殊形式,因为它执行短路评估。在Clojure中,and没有被标记或记录为此类形式,这与保留该术语用于基元或其辅助程序是一致的。

其他可能也应该以类似方式标记的内容包括case case*,import import*,reify reify*,deftype deftype* - A. Webb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接