【问题标题】:Remove/Update a list in Clojure在 Clojure 中删除/更新列表
【发布时间】:2016-01-30 15:13:34
【问题描述】:

我给一个函数两个参数,一个从列表中删除的元素 f 和集合。 (集合也是一个原子)

 (defn playCard [f coll]
  (let [c (first (filter f @coll))] 
    (println coll)
    (println c)
    (swap! ((remove #{c} #{coll}) @coll)) ;;here
    (println coll)
    (println "DIVIDER")

    ))

我可以成功得到f。但是当我尝试从列表中删除它时,我收到错误:“ClassCastException clojure.lang.LazySeq 无法转换为 clojure.lang.IFn”。

在我的工作中,我经常收到类似的错误。我不确定如何解决它。任何帮助,将不胜感激。

正在处理的结构是:

可用卡片的哈希图:

(def cards
  (hash-map
    :card1 {:name "Wisp" :damage 1 :health 1 :cost 0 :charge "t"}
    :card2 {:name "Spider Tank" :damage 3 :health 4 :cost 3}
    :card3 {:name "Boulder Fist Ogre" :damage 6 :health 7 :cost 6})
 )

这些牌的列表(手牌):

(def hand1
      (list (get cards :card1) (get cards :card2) (get cards :card3) (get cards :card1)))

playCard 函数被赋予了牌名和手牌。

【问题讨论】:

  • 你为什么要传入 coll,然后让它成为你立即取消引用的原子?然后你又把它取消为 d?您只是想从集合中删除一个项目吗?
  • 在某个时候,我开始绝望地投入额外的变量。但是,是的,我确实想从集合中删除一个项目。然而,该集合在其他地方被定义为原子。
  • #{coll} 对我来说似乎很奇怪。也许你可以在没有原子的情况下开始,然后进行删除,然后从那里开始构建......

标签: list clojure


【解决方案1】:

Clojure 的remove 接受一个函数或一个集合和一个集合。在这里,您可以使用函数查看基本集合(向量)上的基本删除函数。

user=> (def coll [0 1 2 3])
#'user/coll
user=> (remove #(> % 2) coll)
(0 1 2)
user=> (remove #(= % 2) coll)
(0 1 3)

或者你可以传入一个集合来匹配你想从 coll 中删除的项目:

user=> (remove #{2} coll)
(0 1 3)

如果你有一个原子,你可以在需要它的值时取消引用它。

user=> (def coll (atom [0 1 2 3]))
#'user/coll

请注意,当您只调用 coll 时,您不会得到值:

user=> coll
#object[clojure.lang.Atom 0x7c5e9122 {:status :ready, :val [0 1 2 3]}]

但是当你取消它时你会这样做:

user=> @coll
[0 1 2 3]

所以现在你可以将它传递给你的删除函数,等等。

user=> (remove #(= % 2) @coll)
(0 1 3)

【讨论】:

  • remove 会很乐意将一个集合作为函数,所以#{c} 没有什么问题,实际上它很可能是使用remove 的惯用方式
  • 添加到我的答案中。感谢您的补充,@ChrisMurphy。
  • 我按照答案,但我仍然有问题。我要删除的元素是 c。我不知道如何将函数应用到删除函数中。我试过 (remove (first (filter f @coll) @coll) 并没有发生任何事情。
  • 这里的“c”是什么?扩展您的问题以包含您为fcoll 传递的数据结构或函数。
  • 最好不要使用f 作为任何不是函数的名称。如果您通过4clojure.com 问题解决问题,您将看到其他人的代码。也许只是在删除问题上发布另一个问题。这个问题有很多问题,很难直接回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-06
  • 1970-01-01
  • 2015-06-26
相关资源
最近更新 更多