【问题标题】:Clojure: difference between how special forms, functions and macros are implementedClojure:特殊形式、函数和宏的实现方式之间的区别
【发布时间】:2012-07-13 04:54:07
【问题描述】:

我刚刚开始使用 Clojure。我正在阅读this。 我不明白如何实现特殊形式与如何实现函数和宏之间的区别

几乎所有的函数和宏都是在 Clojure 源代码中实现的。函数和宏的区别在后面解释。 Clojure 编译器可以识别特殊形式,但不会在 Clojure 源代码中实现。

有人可以解释两件事之间的区别吗? (在Clojure源码中实现,在Clojure源码中没有实现)

【问题讨论】:

  • 特殊形式类似于其他语言中的“if”等关键字。

标签: clojure


【解决方案1】:

在 Clojure 源代码中实现

特定功能/抽象的代码是用 clojure 语言本身实现的,即在 .clj 文件中。

在 clojure 源代码中未实现

它是用Java代码实现的。

查看 github 上的 Clojure 代码,你会发现有 Java 和 clojure 代码。

【讨论】:

    【解决方案2】:

    在我看来,也许更有用的说法是:

    特殊形式是语言的一部分,如果有人把它们从你身边拿走, 您将无法更换它们,并且必须恢复它们 通过其他方式。

    例如,如果有人删除了 cond,您可以编写自己的 cond 宏(它只是 if 的包装。如果有人删除 if ...,您将不得不分叉语言并将其放回原处。

    【讨论】:

    • 我认为这个定义既无用也不准确。例如,let 可以实现为fn 之上的宏,但这并不意味着let 不是特殊形式(此处忽略let 实际上是特殊形式之上的宏形成let*)。正如Programming with Nothing 这样的帖子所示,真正需要的唯一特殊形式就是函数。
    • 但是@Arthur Ulfeldt 的回答是否符合 Clojure 的精神?也许他会纠正不准确的部分。
    【解决方案3】:

    加上 Chas Emerick 的 Clojure Programming 一书的引述,我认为这对理解 Clojure 的特殊形式很有帮助。 :]

    特殊形式是 Clojure 的原始计算构建块,Clojure 的所有其余部分都建立在其之上。

    所有不是特殊形式的东西都在 Clojure 中通过从有限的原始操作集引导来实现。

    确实,如果您有这么大的动力,您可以在 Clojure 的特殊形式之上,自己从头开始实现 Clojure(或您选择的其他语言)。

    【讨论】:

      【解决方案4】:

      Special forms 是 Clojure 的原始计算构建块,在它之上 Clojure 的所有其余部分都已构建。

      Functions 是 Clojure 中的一等值;创建它们属于fn 特殊形式。

      【讨论】:

        猜你喜欢
        • 2012-03-12
        • 1970-01-01
        • 1970-01-01
        • 2019-06-08
        • 2015-11-22
        • 2020-03-05
        • 1970-01-01
        • 2011-03-11
        • 1970-01-01
        相关资源
        最近更新 更多