我刚刚开始使用 Clojure。我正在读这个。我不明白如何实现特殊形式与如何实现函数和宏之间的区别
几乎所有的函数和宏都是在 Clojure 源代码中实现的。函数和宏的区别在后面解释。Clojure 编译器可以识别特殊形式,但不会在 Clojure 源代码中实现。
有人可以解释两件事之间的区别吗?(在 Clojure 源代码中实现,在 Clojure 源代码中未实现)
在 Clojure 源代码中实现
特定功能/抽象的代码是用 clojure 语言本身实现的,即在 .clj 文件中。
没有在 clojure 源代码中实现
它是用 Java 代码实现的。
查看 github 上的 Clojure 代码,您会发现有 Java 以及 clojure 代码。
从我的角度来看,也许更有用的说法是:
特殊形式是语言的一部分,如果有人将它们从您手中夺走,您将无法替换它们,而必须通过其他方式恢复它们。
例如,如果有人删除了 cond,您可以编写自己的 cond 宏(它只是 if 的包装。如果有人删除 if ......您将不得不分叉语言并将其放回原处。
加上 Chas Emerick 的Clojure Programming一书的引用,我认为这对理解 Clojure 的特殊形式非常有帮助。:]
特殊形式是 Clojure 的原始计算构建块,Clojure 的所有其余部分都建立在其之上。
Clojure 本身通过从有限的原始操作集引导来实现非特殊形式的所有内容。
事实上,如果您有这样的动力,您可以在 Clojure 的特殊形式之上,自己从头开始实现 Clojure(或您选择的其他语言)。
Special forms
是 Clojure 的原始计算构建块,Clojure 的所有其余部分都是在其之上构建的。
Functions
是 Clojure 中的一流值;创造它们属于fn
特殊形式。