如何解决复合形式与特殊形式之间的区别
| 卢克·范德·哈特(Luke VanderHart)和斯图尔特·塞拉(Stuart Sierra)的《实用的Clojure》第19页第2章有一段, 特殊形式的定义:特殊形式是复合形式的一种特殊类型。在大多数情况下,它们的用法与函数调用非常相似。区别在于,特殊形式的第一种形式不是在某处定义的函数,而是Clojure内置的特殊系统形式。 第一个问题,这里的拼写单词是错字吗?这个词不是项目吗?如果没有,def是一种格式吗?这意味着该代码包含3种形式。 :-s 原因稍后,当撰写说明一个示例时,他使用了item。(def message \"Hello,World!\")
分析第一种形式(定义消息\“ Hello,World!\”),您首先会看到它被括在括号中。因此,它是一个列表,将被评估为功能应用程序或特殊形式。列表中有三项:def,message和\“ Hello,World!\”。列表中的第一项def将是所调用的函数或特殊形式。在这种情况下,它是一种特殊形式。但是像一个函数一样,它需要两个参数-要定义的var和绑定它的值。评估此形式将创建一个变量,该变量将值\“ Hello,World!\”建立到符号消息的绑定。
*第二个问题,仅当列表的第一项是仅使用Clojure预先定义的内容时,复合形式才是特殊形式吗?如果是,那么可以创建自定义特殊表格吗?然后将定制复合表格称为特殊表格吗?因为根据定义,我的自定义不是内置在clojure中的东西,而是在其他地方定义的。
编辑:
我想我第一个问题的答案是不,这不是错字。 def是一种形式。
因为后来写到,
第二种形式(println消息)也是一个列表,这次是常规功能应用程序。它有两种组成形式-每个形式都是一个符号
这意味着(println message)>整个事物都是一种形式,它所拥有的其他所有事物(函数参数)也是一种形式。
但是,在一开始,作者说过,有四种基本形式的形式。
文字,
符号,
复合形式和
特殊形式。
根据书中符号的定义,它不是符号。
符号定义符号是可解析为值的形式。它们可能被认为与变量大致相似,尽管在技术上并不准确,因为它们实际上并不是以大多数语言中的变量相同的方式变量。在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和少数其他内置函数(如果将它们作为函数进行评估会破坏这些内置过程),这些特殊形式要么编译到解释器中,要么实现为宏。
,我写了那章。绝对可以写得更好,但是我将尝试清除它:
要回答您的第一个问题:是的,形式是正确的词。单个符号(例如def
)仍然是表格,因为表格可以评估任何形式。有时我确实说“项目”,但这只是我用来在列表中指出“事物”的一个更通用的词。从技术上讲,如果它是用Clojure代码编写的并且可以评估,则它是一种形式。
对于您的第二个问题,不,复合形式是任何其他形式的基础。例如,如果我定义了这个:
(defn sq [x] (* x x))
然后叫它
(sq 3) => 9
表达式“ 5”是由两种其他形式组成的复合形式,第一种是符号“ 6”,将与您的函数等效,第二种是文字“ 7”。
“复合形式”一词不是正式的定义,也不是任何东西,这只是我可以想到的最简单的方式来表达形式可以由其他形式构建的事实。无论我在哪里想放3
,在哪里都可以放x
是合法的语法,在我可以放x
的任何地方都可以放(f x)
-因为它们都是形式。
为了回答您的最后一个问题,“ 2”是对编译器具有特殊含义的符号,因此在我在书中使用的术语中,它是一种特殊形式。
,第一个问题:
是的-我认为“特殊格式的第一项”在这种情况下会更清楚。但是由于符号本身就是一种形式,因此将其称为“特殊形式的第一形式”在技术上也是正确的。
请注意,特殊名称的第一项本身有时也称为特殊格式,例如“ def是特殊格式”。我认为这里的术语有些混乱,但是只要您了解特殊形式的概念,通常就可以清楚理解这是什么意思。通常,如果您认为“特殊形式”是指整个形式,那将是正确的。
关于Lisp表单定义的问题在这里很有帮助。
第二个问题
是的-仅当第一个符号是Clojure中预定义的特殊格式符号之一时,才存在特殊格式。有关有用的列表,请参见http://clojure.org/special_forms。
您目前无法定义自己的特殊格式-尽管可以针对所有实际用途使用宏或函数获得类似的结果,所以这绝不是问题。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。