我在一个递归函数折叠中遇到了一个让人困惑的异常。以下是 REPL 转录:
nREPL 服务器在端口 57818 上启动于主机 127.0.0.1 - nrepl://127.0.0.1:57818
REPL-y 0.3.5,nREPL 0.2.6
Clojure 1.7.0-alpha5
Java HotSpot(TM) 64 位服务器虚拟机 1.7.0_76-b13
文档:(doc 函数名)
 ;(find-doc "部分名称")
源:(source 函数名)
Javadoc:(javadoc java对象或类)
退出:Control+D 或 (exit) 或 (quit)
结果:存储在变量 *1, *2, *3,*e 中出现异常
user=> (use 'foldtest.core)
nil
user=> (source leafs)
(defn leafs [xs]
(->> (r/mapcat (fn [k v]
(if (map? v)
(leafs v)
[[k v]]) xs)
(r/foldcat)))
nil
user=> (leafs (hash-map :a (hash-map :b 1 :c 2)))
ClassCastException:clojure.lang.PersistentHashMap$1 无法转换为 clojure.lang.IFn clojure.core.reducers/fjinvoke (reducers.clj:48)
user=> (pst)
ClassCastException:clojure.lang.PersistentHashMap$1 无法转换为 clojure.lang.IFn
clojure.core.reducers/fjinvoke (reducers.clj:48)
clojure.lang.PersistentHashMap.fold (PersistentHashMap.java:207)
clojure.core.reducers/eval1347/fn--1348 (reducers.clj:367)
clojure.core.reducers/eval1220/fn--1221/G--1211--1232 (reducers.clj:81)
clojure.core.reducers/folder/reify--1247 (reducers.clj:130)
clojure.core.reducers/fold (reducers.clj:98)
clojure.core.reducers/fold (reducers.clj:96)
clojure.core.reducers/foldcat (reducers.clj:318)
foldtest.core/leafs (core.clj:5)
foldtest.core/leafs/fn--1367 (core.clj:7)
clojure.core.reducers/mapcat/fn--1277/fn--1280 (reducers.clj:185)
clojure.lang.PersistentHashMap$NodeSeq.kvreduce (PersistentHashMap.java:1127)
nil
user=>
请注意,它 *必须* 是嵌套在哈希表中的哈希表。其他数组和哈希表的组合似乎都很好。
user=> (leafs (array-map :a (hash-map :b 1 :c 2)))
[[:c 2] [:b 1]]
user=> (leafs (hash-map :a (array-map :b 1 :c 2)))
[[:b 1] [:c 2]]
user=> (leafs (hash-map :a (hash-map :b 1 :c 2)))
ClassCastException:clojure.lang.PersistentHashMap$1 无法转换为 clojure.lang.IFn clojure.core.reducers/fjinvoke (reducers.clj:48)
user=> (leafs (array-map :a (array-map :b 1 :c 2)))
[[:b 1] [:c 2]]
user=>
可能有关系: CLJCLR-63
因为我发现了这个不一致性(我不确定这是一个错误),所以我花了很长时间才解决这个问题。
user=> (def a {:a 1})
#'user/a
user=> (type a)
clojure.lang.PersistentHashMap
user=> (let [a {:a 1}] (type a))
clojure.lang.PersistentArrayMap
user=> (type {:a 1})
clojure.lang.PersistentArrayMap
user=>
(我已在定义中放置了测试输入,但使用定义的变量始终失败,但常量总是成功!)