2013-02-23 81 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) 

当你不报/,你得到它的价值,这是内置的分裂功能,而不是象征。