Clojure:特殊形式、函数和宏实现的区别

12
我刚刚开始学习Clojure。我正在阅读这个。 当它说:

几乎所有的函数和宏都是用Clojure源代码实现的。函数和宏之间的区别将在后面解释。特殊形式由Clojure编译器识别,而不是在Clojure源代码中实现。

有人能解释一下这两个东西的区别吗?(在Clojure源代码中实现和不在Clojure源代码中实现)


特殊形式类似于其他语言中的关键字,如“if”。 - Cubic
4个回答

7

用Clojure源代码实现

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

未在Clojure源代码中实现

它是用Java代码实现的。

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


2
也许更有用的表达方式是:特殊形式是语言中的一部分,如果有人将它们从你手中拿走,你将无法替换它们,并且必须通过其他方式恢复它们。
例如,如果有人删除了cond,您可以编写自己的cond宏(它只是if的包装器)。但如果有人删除if ... 您将不得不分叉语言并将其放回。

1
我认为这个定义既不实用也不准确。例如,let可以在fn之上实现为宏,但这并不意味着let不是一个特殊形式(忽略这里的let实际上是基于特殊形式let*的宏)。正如《无所不用其极编程》(Programming with Nothing)等文章所示,真正需要的只有函数这一特殊形式。 - amalloy
但是@Arthur Ulfeldt的回答是否符合Clojure的精神呢?也许他会澄清其中不准确的部分。 - octopusgrabbus

1

以下是摘自Chas Emerick的书《Clojure Programming》的一句话,我认为它非常有助于理解Clojure的特殊形式。 :]

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

除了特殊形式之外的所有内容都是通过从有限的原始操作开始引导Clojure本身实现的。

事实上,如果你有动力,你可以在Clojure的特殊形式之上从头开始独立实现Clojure(或您选择的其他语言)。


0

特殊形式是Clojure的计算原始构建块,所有其他Clojure都是在其基础上构建的。

函数是Clojure中的一等值;创建它们由fn特殊形式完成。


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