2011-03-20 96 views
3

爲什麼這一系列clojure命令返回false而不是true?陳述1「C」和2「(引用C)」的結果有什麼區別?引用混淆

; SLIME 2009-03-04 
user> ('A 'B 'C) 
C 
user> (last '('A 'B 'C)) 
(quote C) 
user> (= ('A 'B 'C) (last '('A 'B 'C))) 
false 

這個問題是有些類似於How does clojure's syntax-quote work?

+0

您的意思是「Quoting Confujon」? – pablosaraiva 2011-03-23 14:46:42

回答

7

在Clojure中(和其他的Lisp)的'是表單(quote ...)的快捷方式。所以,當Clojure的看到這個:

('A 'B 'C) 

這是「翻譯」由讀者進入:

((quote A) (quote B) (quote C)) 

每個這樣的報價形式計算爲一個符號,所以(quote A)評估名爲A.在符號Clojure,符號是函數,可以應用,所以((quote A) (quote B) (quote C))實際上是一個函數調用。從文檔:

「像關鍵字一樣,符號爲一個參數(地圖)的invoke()實現IFn並帶有可選的第二個參數(默認值)。例如('mysym my-hash-map: none)意思相同(get my-hash-map'mysym:none)「。

所以會發生什麼是C是默認值,這就是它返回的原因。

同時,該

'('A 'B 'C) 

由讀者翻譯成

(quote ((quote A) (quote B) (quote C))) 

這實際上是三個要素,每一個都是兩個元素的列表,符號quote和列表另一個符號(在這種情況下爲AB,C)。因此(last '('A 'B 'C))實際上是(quote C)。這是這兩個結果之間的差異,C是名稱爲C的符號,而(quote C)是兩個元素的列表。

可以證實這一點:

user=> (class ('A 'B 'C)) 
clojure.lang.Symbol 
user=> (class (last '('A 'B 'C))) 
clojure.lang.PersistentList 
user=> 

希望是十分明顯!

+0

感謝您的幫助 – tjb 2011-03-20 18:04:26

+0

不客氣! – spacemanaki 2011-03-20 18:06:34

1

('x'y)非常不尋常,因爲這個原因。通常你需要'(x y),它是文字符號x和y的列表。如果你用'('x'y)引用TWICE,你會得到一個帶有(引號x)的列表:文字符號引號,後面跟着文字符號x。