2011-05-08 53 views
3

以下两个命令打印出在REPL同样的事情:Clojure在这种情况下报价和字符串有什么区别?

user=> (println "(foo bar)") 
(foo bar) 
nil 
user=> (println (quote (foo bar)) 
(foo bar) 
nil 

因此,在这种情况下,什么是报价和字符串之间的区别?

编辑: (+ 3 2) and (+ (quote 3) 2)是一样的。文档说,报价产生未评估的形式(所以也许我在这里回答我自己的问题,但请确认)报价是懒惰评估的优化?

回答

10

他们确实是不同的东西:

user=> (class '(foo bar)) 
clojure.lang.PersistentList 
user=> (class "foo bar") 
java.lang.String 

即使他们可能具有相同println结果,他们是不一样的。

其余的,@bmillare是对的:你不懒惰quote,你引用表达文字。

5

他们看起来相同的原因是因为指定println将字符串和引用表单的内容(包括符号的名称)打印到标准输出。如果你要打印的形式,他们将如何看待输入到阅读器时喜欢使用PRN(PR如果你不想换行)

user=> (prn "(foo bar)") 
"(foo bar)" 
nil 
user=> (prn (quote (foo bar))) 
(foo bar) 
nil 

对于其他问题,

报价是不是懒惰评估的优化。你得到(+ 3 2)和(+(quote 3)2)的原因是你引用了一个文字,例如数字,关键字或字符串。 (http://clojure.org/reader)在表单传递给上层表单之前,在读取时评估文字。另一种思考它的方式是引用文字简单地被定义为一种身份。

相关问题