爲什麼這一系列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?
爲什麼這一系列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?
在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
和列表另一個符號(在這種情況下爲A
,B
,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=>
希望是十分明顯!
感謝您的幫助 – tjb 2011-03-20 18:04:26
不客氣! – spacemanaki 2011-03-20 18:06:34
('x'y)非常不尋常,因爲這個原因。通常你需要'(x y),它是文字符號x和y的列表。如果你用'('x'y)引用TWICE,你會得到一個帶有(引號x)的列表:文字符號引號,後面跟着文字符號x。
您的意思是「Quoting Confujon」? – pablosaraiva 2011-03-23 14:46:42