以下两个命令在repl中打印出相同的内容:
user=> (println "(foo bar)")
(foo bar)
nil
user=> (println (quote (foo bar))
(foo bar)
nil
所以在这种情况下,引号和字符串之间的区别是什么?
编辑:
(+ 3 2) and (+ (quote 3) 2)
是一样的。文档说引用产生未评估的形式(所以也许我在这里回答我自己的问题,但请验证)引用是否是一个懒惰评估的优化?
答案 0 :(得分:10)
他们确实是不同的东西:
user=> (class '(foo bar))
clojure.lang.PersistentList
user=> (class "foo bar")
java.lang.String
即使他们可能有相同的println
结果,但他们也不一样。
对于其他人来说,@ bmillare是对的:你没有quote
懒惰,你引用来表达文字。
答案 1 :(得分:5)
它们看起来相同的原因是因为println被指定为将字符串和引用形式的内容(包括符号的名称)打印到stdout。如果您想要输入表格时输入到阅读器的样子,请使用prn(如果您不想要换行,请使用pr)
user=> (prn "(foo bar)")
"(foo bar)"
nil
user=> (prn (quote (foo bar)))
(foo bar)
nil
对于另一个问题,
引用不是懒惰评估的优化。你得到(+ 3 2)和(+(引用3)2)的原因是你引用了一个文字,例如:数字,关键字或字符串。 (http://clojure.org/reader)在将表单传递给上层表单之前,在读取时评估文字。另一种思考它的方法是引用文字只是被定义为一种身份。