2013-02-23 111 views
3

我正在運行一些4Clojure問題,並用我的一些代碼打了一些奇怪的行爲。進一步調查後,似乎罪魁禍首是使用引用宏與列表函數。爲什麼在下面的代碼中這很重要,爲什麼會產生不正確的結果?爲什麼這些Clojure列表不同?

user=> (= (class '(/ 1 2)) (class (list/1 2))) 
true 
user=> (def a '(/ 1 2)) 
#'user/a 
user=> (def b (list/1 2)) 
#'user/b 
user=> (class a) 
clojure.lang.PersistentList 
user=> (class b) 
clojure.lang.PersistentList 
user=> (apply (first a) (rest a)) 
2 
user=> (apply (first b) (rest b)) 
1/2 
user=> (class (first a)) 
clojure.lang.Symbol 
user=> (class (first b)) 
clojure.core$_SLASH_ 

回答

2

不幸的是,您在表達式(apply (first a) (rest a))中使用了符號對象作爲函數。符號對象在地圖中查找自身的值作爲鍵:

('/ {'+ :plus '/ :slash '- :minus} :not-found) 
=> :slash 

('/ {'+ :plus '$ :dollar '- :minus} :not-found) 
=> :not-found 

('/ 1 :not-found) 
=> :not-found 

('/ 1 2) 
=> 2 
9
'(/ 1 2) 

類似於:

(list '/ 1 2) 

當你不報/,你得到它的價值,這是內置的分裂功能,而不是象徵。