【问题标题】:Clojure: is `fn` a special-symbol, a macro or a special form?Clojure:`fn` 是特殊符号、宏还是特殊形式?
【发布时间】:2014-02-01 12:13:51
【问题描述】:

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

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

最后,(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 中还有其他类似的符号吗?

【问题讨论】:

    标签: clojure


    【解决方案1】:

    其他例子是

    let let*
    letfn letfn*
    loop loop*
    

    加星标的版本是编译器级别的真正特殊符号,是语言的原语。未加星标的版本是在 Clojure 中定义的 vars。这些是较低级别的加星版本的助手,可以在更方便的级别(即在 Clojure 中)执行解构、参数检查和文档等操作。

    Clojure 的文档defines special forms 严格来说是“Clojure 内置的执行核心操作的原语”。但这实际上意味着在适用于文档的list of special forms 时不那么严格地适用于他们的未加星标的助手。

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

    【讨论】:

    • 可以说也应该以类似方式标记的其他内容包括 `case case*、import import*、reify reify*、deftype deftype*"。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-17
    • 1970-01-01
    • 2019-06-08
    • 2015-09-06
    • 2019-12-24
    • 2015-11-22
    • 1970-01-01
    相关资源
    最近更新 更多