clojure让java集合分解结构

clojure让java集合分解结构,java,clojure,Java,Clojure,我不熟悉Clojure,对let解构感到困惑: java.util.ArrayList (def arr(java.util.ArrayList.[1 2 3 4])) ;; => #'ns/arr 在分解结构时: (让[[a b]arr] (+a b)) ;; => 3. 一切正常,但: (让[{a0b1}arr] (+a b)) ;; 捕获的NullPointerException 我忽略了哪些点?通过将let扩展为let*,可以看到这种行为的原因: (宏扩展-1 "(让"a b"ar

我不熟悉Clojure,对
let
解构感到困惑:

java.util.ArrayList
(def arr(java.util.ArrayList.[1 2 3 4]))
;; => #'ns/arr
在分解结构时:

(让[[a b]arr]
(+a b))
;; => 3.
一切正常,但:

(让[{a0b1}arr]
(+a b))
;; 捕获的NullPointerException

我忽略了哪些点?

通过将
let
扩展为
let*
,可以看到这种行为的原因:

(宏扩展-1
"(让"a b"arr)
(+a b)))
;;=> (让*[vec_uuu1 arr
;a(clojure.core/nth-vec_uu1 0零)
;b(clojure.core/nth-vec_u1 nil)]
59
(1)
'(设[{a0b1}arr]
(+a b)))
;;=> (让*[map_uuu1 arr
;映射1(如果(clojure.core/seq?映射1)
;;(clojure.lang.PersistentHashMap/create
(clojure.core/seq map___1))
;地图(1)
;a(clojure.core/get map_uu1 0)
;b(clojure.core/get map_uu1)]

如您所见,顺序分解使用
nth
函数,而关联分解使用
get
函数。
nth
使用的方法支持
ArrayList
实现的接口,
get
使用的方法不支持
RandomAccess
。默认情况下,
get
返回
null
,这就是为什么会出现
NullPointerException

顺便说一句,由于
LinkedList
未实现
RandomAccess
,因此也会出现错误:

(def链接(java.util.LinkedList.[1 2 3 4]))
(让[[a b]链接]
(+a b))
;; java.lang.UnsupportedOperationException:n此类型不支持:LinkedList

使用原生Clojure列表可以得到相同的结果:
(def arr(list 1 2 3 4))