卢克·范德·哈特(Luke VanderHart)和斯图尔特·塞拉(Stuart Sierra)在《实用的Clojure》第19页第2章中有一段
特殊形式定义:特殊形式是复合形式的一种特殊类型。在大多数情况下,它们的用法与函数调用非常相似。区别在于,特殊形式的第一种形式不是在某处定义的函数,而是Clojure内置的特殊系统形式。
第一个问题,这里的拼写单词是错字吗?这个词不是项目吗?如果没有,def是一种形式吗?这意味着该代码包含3种形式。 :-s
原因稍后,当撰写说明一个示例时,他使用了item。
(def message "Hello, World!")
分析第一种形式(定义消息“ Hello,World!”),您首先会看到它被括在括号中。因此,它是一个列表,将被评估为功能应用程序或特殊形式。列表中有三个项目:def,消息和“ Hello,World!”。列表中的第一项def将是所调用的函数或特殊形式。在这种情况下,这是一种特殊形式。但是像一个函数一样,它需要两个参数-定义的var和绑定它的值。评估此表单将创建一个变量,该变量建立值“ Hello,World!”的绑定。到符号消息。
*第二个问题,仅当列表的第一项是仅使用Clojure预先定义的内容时,复合形式才是特殊形式吗?如果是,那么可以创建自定义特殊表格吗?然后将自定义复合表格称为特殊表格吗?因为根据定义,我的自定义不是内置在clojure中的东西,而是在其他地方定义的。
编辑:
我想我第一个问题的答案是不,不是错字。 def是一种形式。
因为后来写到,
第二种形式(println消息)也是一个列表,这次是常规功能应用程序。它有两种组成形式-每个形式都是一个符号
这意味着,(println消息)>整个事物都是一种形式,它拥有的其他所有事物(函数参数)也是一种形式。
但是,在一开始,作者说过,有四种基本形式。
文字,
符号,
复合形式和
特殊形式。
根据书中符号的定义,它不是符号。
符号定义符号是可解析为值的形式。它们可能被认为与变量大致相似,尽管这在技术上并不准确,因为它们实际上并不像大多数语言中的变量那样可变。在Clojure中,符号用于标识函数自变量以及全局或局部定义的值。以下各节将更详细地讨论符号及其分辨率。原因,编写def并按回车键会产生以下错误消息,
def属于哪一类?
最佳答案
def是一种特殊形式。要了解原因,请考虑一下如何将def表达式作为函数来求值。当您输入类似(square(* x y))的表达式时,可以先评估子表达式(* x y),然后将square应用于任何表达式。 def不会发生这种情况,并且有充分的理由,您可以查看是否启动了REPL:
> (def a 1)
#'user/a
> (def a 2)
...
接下来应该怎么办?如果def是正常函数,则REPL将对a求值,然后尝试将def应用于参数1和2:也就是说,它将尝试重新定义1。但是,您可能希望做的是定义符号“ a”以求值为2(在过程中覆盖旧符号)。为了获得所需的行为,而def和少数其他内置函数(如果将它们评估为函数会破坏这些内置过程),可以将这些特殊形式编译到解释器中或实现为宏。
关于clojure - 复合形式与特殊形式之间的区别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6132758/