以下两个命令在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为了懒惰,你引用来表达文字.
他们看起来是一样的原因是因为指定的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)在将表单传递给上层表单之前,在读取时评估文字.另一种思考方式是引用文字只是被定义为一种身份.