为什么这些Clojure列表有所不同?

时间:2013-02-23 06:21:48

标签: clojure

我正在查看一些4Clojure问题,并使用我的一些代码遇到了一些奇怪的行为。经过进一步调查,似乎罪魁祸首是使用报价宏vs列表功能。为什么这在下面的代码中很重要,为什么会产生不正确的结果呢?

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 个答案:

答案 0 :(得分:9)

'(/ 1 2)

类似于:

(list '/ 1 2)

如果不引用/,则会得到其值,即内置除法函数,而不是符号。

答案 1 :(得分: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
相关问题