Clojure 使用postwalk将向量更改为列表

Clojure 使用postwalk将向量更改为列表,clojure,Clojure,没有printlns::title{:bu hu}我所期待的 我得到的是: (postwalk #(do (println "visiting:" %) (if (vector? %) (seq %) %)) [:title {:bu "hu"}]) 为什么它是访问[:bu hu]而不是{:bu hu}?它似乎可以很好地处理嵌套向量,但如果抛出一个映射,jvm就会对我生气,并吐

没有printlns::title{:bu hu}我所期待的

我得到的是:

(postwalk #(do (println "visiting:" %)
               (if (vector? %)
                 (seq %)
                 %))
          [:title {:bu "hu"}])

为什么它是访问[:bu hu]而不是{:bu hu}?它似乎可以很好地处理嵌套向量,但如果抛出一个映射,jvm就会对我生气,并吐出难以理解的淫秽内容

我得到了更好的堆栈跟踪:

visiting: :title
visiting: :bu
visiting: hu
visiting: [:bu hu]
Stack trace of root exception is empty; this is likely due to a JVM optimization 
that can be disabled with -XX:-OmitStackTraceInFastThrow.
java.lang.ClassCastException: 
[:bu hu]不是地图,它是地图中的第一个地图条目。不幸的是,它实际上不是clojure.lang.MapEntry的实例。walk将其转换为向量,然后再应用传递到postwalk的函数postwalk在内部调用walk。即使在那之后,我仍然难以相信


我不知道最好的解决办法是什么。但我认为至少确切地知道它发生的原因会对您有所帮助。

我得到了一个更好的堆栈跟踪:

visiting: :title
visiting: :bu
visiting: hu
visiting: [:bu hu]
Stack trace of root exception is empty; this is likely due to a JVM optimization 
that can be disabled with -XX:-OmitStackTraceInFastThrow.
java.lang.ClassCastException: 
[:bu hu]不是地图,它是地图中的第一个地图条目。不幸的是,它实际上不是clojure.lang.MapEntry的实例。walk将其转换为向量,然后再应用传递到postwalk的函数postwalk在内部调用walk。即使在那之后,我仍然难以相信


我不知道最好的解决办法是什么。但我想至少你能确切地知道它发生的原因,这会对你有所帮助。

[:bu hu]是一个clojure.lang.MapEntry,postwalk将访问地图中的每个条目。遗憾的是,clojure.walk/postwark将MapEntry作为clojure.lang.PeristentVector传递,因此无法可靠地将条目与postwark中的向量区分开来。我认为您需要使用自己的walking实现。

[:bu hu]是一个clojure.lang.MapEntry,postwalk将访问地图中的每个条目。遗憾的是,clojure.walk/postwark将MapEntry作为clojure.lang.PeristentVector传递,因此无法可靠地将条目与postwark中的向量区分开来。我认为您需要使用自己的步行实现。

Nice insight+1!我喜欢Clojure,但正是这样的问题让我想起了为什么我们为编程语言发明了静态类型系统……很好的洞察力+1!我喜欢Clojure,但正是这样的问题让我想起了为什么我们为编程语言发明了静态类型系统。。。。