【问题标题】:Recursively peek a map to get its values in Clojure在 Clojure 中递归查看地图以获取其值
【发布时间】:2017-03-18 12:16:01
【问题描述】:

我正在尝试编写一个函数,该函数将递归地弹出一个映射,以便一次获取一个值。

以下是我到目前为止所得到的..

(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

是什么导致了这个问题?

干杯

【问题讨论】:

  • 更适合CodeReview
  • @Thumbnail 嗯,不是吗?从错误消息来看,这个问题中的代码似乎不符合“工作”的条件。
  • @SamEstep 确实如此。

标签: recursion clojure


【解决方案1】:

rest 返回的不是向量,而是惰性序列。当您尝试peek on in 时出现错误:

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

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

我认为这里没有任何理由将您的向量包装到类型化记录中。您始终可以轻松地对向量进行迭代。

【讨论】:

  • 好的,我正在使用 defrecord,因为我希望以后能够调用它。整个“任务”看起来像这样,(def task6(机器人。:main-office(停止。:r131:main-office nil nil):r111(包。[“记事本”,“鞋子”] [0.1 1] ) false)) 然后将其传递给方法。有没有办法让我迭代输入的记录?
  • ` (doseq [arg (:&args test)] (println arg)) :c101 :main-office :a1 nil `
  • 顺便说一句,您像 Java 一样编写 Clojure。我个人会将您的数据(机器人、程序包等)保存在简单的数据结构中,如矢量和地图。
  • 好的,谢谢,我正在努力改变它。效果很好,有没有一种方法可以通过打印将值分配给不同的变量?
猜你喜欢
  • 1970-01-01
  • 2015-01-28
  • 2020-09-20
  • 1970-01-01
  • 2017-03-27
  • 2012-01-13
  • 1970-01-01
  • 2021-12-10
  • 1970-01-01
相关资源
最近更新 更多