不知道如何从Clojure创建ISeq

1 dictionary clojure hashmap

我想使用下一个代码从clojure上的地图添加值:

(letfn [(r [l a]
          (if (empty? l)
            a
            (if (map? l)
              (r (first(vals l)) (+ a (first (vals l))))
              (r (rest l) (+ a (first l))))))]
  (r {:a 1 :b 2 :c 3} 0)
Run Code Online (Sandbox Code Playgroud)

但我收到以下错误:

IllegalArgumentException不知道如何从以下位置创建ISeq:java.lang.Long clojure.lang.RT.seqFrom(RT.java:542)

Shl*_*omi 5

问题是在代码中您正在测试emptyon l,但不确定l是否为seq。您应该在stacktrace中进一步查找:

不知道如何从以下位置创建ISeq:java.lang.Long

               RT.java:  528  clojure.lang.RT/seqFrom
               RT.java:  509  clojure.lang.RT/seq
              core.clj:  137  clojure.core/seq
              core.clj: 5948  clojure.core/empty?      <------
                  REPL:   13  user/eval19330/r
                  REPL:   16  user/eval19330/r
                  REPL:   21  user/eval19330
Run Code Online (Sandbox Code Playgroud)

发生这种情况是因为(first (vals l))作为l参数传递给下一个迭代的是数字而不是seq,在您的情况下,它只是value 1