在这种情况下,使用Clojure,引号和字符串之间有什么区别?

foo*_*bar 3 clojure

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

user=> (println "(foo bar)")
(foo bar)
nil
user=> (println (quote (foo bar))
(foo bar)
nil
Run Code Online (Sandbox Code Playgroud)

那么在这种情况下,引号和字符串之间有什么区别?

编辑: (+ 3 2) and (+ (quote 3) 2)是一样的.文档说引用产生未评估的形式(所以也许我在这里回答我自己的问题,但请验证)引用是一个优化与惰性评估?

sku*_*uro 10

他们确实是不同的事情:

user=> (class '(foo bar))
clojure.lang.PersistentList
user=> (class "foo bar")
java.lang.String
Run Code Online (Sandbox Code Playgroud)

即使他们可能有相同的println结果,他们也不一样.

对于其他人来说,@ bmillare是对的:你不是quote为了懒惰,你引用来表达文字.


bmi*_*are 5

他们看起来是一样的原因是因为指定的println打印字符串和引用的形式,包括符号的名字的内容,到标准输出.如果要打印表格,请将它们输入到阅读器时的样子,请使用prn(如果您不想要换行,请使用pr)

 user=> (prn "(foo bar)")
 "(foo bar)"
 nil
 user=> (prn (quote (foo bar)))
 (foo bar)
 nil
Run Code Online (Sandbox Code Playgroud)

对于另一个问题,

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