Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure:特殊窗体、函数和宏的实现方式之间的差异_Clojure - Fatal编程技术网

Clojure:特殊窗体、函数和宏的实现方式之间的差异

Clojure:特殊窗体、函数和宏的实现方式之间的差异,clojure,Clojure,我刚从Clojure开始。我正在读书。 我不理解特殊表单的实现方式与函数和宏的实现方式之间的区别 几乎所有函数和宏都是在Clojure源代码中实现的。函数和宏之间的区别将在后面解释。特殊形式由Clojure编译器识别,而不是在Clojure源代码中实现 有人能解释这两件事的区别吗?(在Clojure源代码中实现,而不是在Clojure源代码中实现)在Clojure源代码中实现 特定功能/抽象的代码是用clojure语言本身实现的,即在.clj文件中实现的 未在clojure源代码中实现 它是用J

我刚从Clojure开始。我正在读书。 我不理解特殊表单的实现方式与函数和宏的实现方式之间的区别

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


有人能解释这两件事的区别吗?(在Clojure源代码中实现,而不是在Clojure源代码中实现)

在Clojure源代码中实现

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

未在clojure源代码中实现

它是用Java代码实现的


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

从我的角度来看,也许更有用的说法是:

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


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

特殊形式
是Clojure的基本计算构建块,在其之上 Clojure的其余部分都建成了

函数
在Clojure中是一流的值;创建它们属于特殊形式。

加上Chas Emerick的《Clojure编程》一书中的引用,我认为这对理解Clojure的特殊形式非常有帮助。:]

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

所有不是特殊形式的东西都是通过从有限的一组基本操作中引导而在Clojure中实现的

事实上,如果您有这样的动机,您可以在Clojure的特殊形式之上,自己从头开始实现Clojure(或您选择的另一种语言)


我认为这个定义既不有用也不准确。例如,
let
可以实现为
fn
之上的宏,但这并不意味着
let
不是一种特殊形式(这里忽略
let
实际上是特殊形式
let*
之上的宏)。就像show这样的帖子,你真正需要的唯一特殊形式是函数。但是@Arthur Ulfeldt的回答是否符合Clojure的精神?也许他会纠正不准确的部分。特殊形式类似于其他语言中的关键字“if”。