递归地查看地图以在Clojure中获取其值

时间:2017-03-18 12:16:02

标签: recursion clojure

我试图编写一个函数,它会递归地弹出一个地图,以便一次一个地获取一个值。

以下是我到目前为止所做的事情。

(defrecord Stoptest [&args])

(def test (Stoptest. [:c101 :main-office :a1]))

(defn stopPop [x]
 (peek (-> x :&args))
 (recur(peek(rest x))))

(stopPop test)

我收到错误提及以下内容:

clojure.lang.LazySeq cannot be cast to clojure.lang.IPersistentStack

导致此问题的原因是什么?

干杯

1 个答案:

答案 0 :(得分:1)

rest不是一个向量而是一个懒惰的seq。当您尝试peek时,会出现错误:

(peek (seq [1 2 3])) ;; gives the same error

问题发生在这里,因为在递归的每一步都有不同的类型对象。在顶部,您有Stoptest个实例。接下来,您有一个以其他方式运行的延迟序列。

我没有看到任何理由将你的矢量包装到打字记录中。您可以轻松地迭代矢量。