2011-05-08 52 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)在表單傳遞給上層表單之前,在讀取時評估文字。另一種思考它的方式是引用文字簡單地被定義爲一種身份。

相關問題