什么';在Clojure中,引号和字符串的区别是什么?

什么';在Clojure中,引号和字符串的区别是什么?,clojure,Clojure,以下两个命令在repl中打印出相同的内容: user=> (println "(foo bar)") (foo bar) nil user=> (println (quote (foo bar)) (foo bar) nil 在这种情况下,引号和字符串之间有什么区别 编辑: (+32)和(+(引号3)2)是相同的。文档说quote生成未评估的表单(因此我可能在这里回答我自己的问题,但请验证)quote是否是一个带有延迟评估的优化?它们确实是不同的东西: user=> (cla

以下两个命令在repl中打印出相同的内容:

user=> (println "(foo bar)")
(foo bar)
nil
user=> (println (quote (foo bar))
(foo bar)
nil
在这种情况下,引号和字符串之间有什么区别

编辑:
(+32)和(+(引号3)2)
是相同的。文档说quote生成未评估的表单(因此我可能在这里回答我自己的问题,但请验证)quote是否是一个带有延迟评估的优化?

它们确实是不同的东西:

user=> (class '(foo bar))
clojure.lang.PersistentList
user=> (class "foo bar")
java.lang.String
即使它们可能具有相同的
println
结果,它们也不相同


对于其余部分,@bmillare是正确的:你不必为懒惰而引用,你引用来表示文字。

它们看起来相同的原因是指定println将字符串和引用的表单的内容(包括符号的名称)打印到stdout。如果你想按输入到读卡器时的样子打印表单,请使用prn(如果你不想换行,请使用pr)

至于另一个问题,

Quote不是具有惰性评估的优化。得到(+3 2)和(+(引号3)2)的原因是您引用的是文字,例如数字、关键字或字符串。(http://clojure.org/reader)在将表单传递给上层表单之前,在读取时对文本进行求值。另一种思考它的方式是引用文字,因为文字被定义为一个标识

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