List 删除/更新Clojure中的列表

List 删除/更新Clojure中的列表,list,clojure,List,Clojure,我给了一个函数两个参数,一个要从列表中删除的元素f和集合。(集合也是一个原子) 我可以成功地得到f。但当我试图将其从列表中删除时,我收到一个错误:“ClassCastException clojure.lang.LazySeq不能强制转换为clojure.lang.IFn” 在我的工作中,我经常收到类似的错误。我不知道如何修理它。任何帮助都将不胜感激 正在处理的结构包括: 可用卡的哈希图: (def cards (hash-map :card1 {:name "Wisp" :dama

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

我可以成功地得到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})
 )
这些卡片的列表(手牌):

playCard功能被赋予一个卡名和一只手。

Clojure's接受一个功能或一个集合和一个集合。在这里,您可以看到使用函数的基本集合(向量)上的基本移除函数

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]
现在你可以把它传递给你的remove函数,等等

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

为什么你要传递coll,然后把它变成一个原子,然后你马上去引用它?然后你又把它定义为d?你只是想从一个集合中删除一个项目吗?在某个时候,我开始在绝望中抛出额外的变量。但是,是的,我确实想从集合中删除一个项目。然而,这个集合在别处被定义为一个原子。
{coll}
对我来说似乎很奇怪。也许你可以从没有原子的情况下开始,只做一个移除,然后从那里构建一些东西…
remove
会很高兴地使用一个集合作为函数,所以
{c}
没有什么错,事实上这很可能是我的答案中添加的使用
remove
的惯用方法。谢谢你的补充,@ChrisMurphy。我明白了答案,但我仍然有一个问题。我想删除的元素是c。我不知道如何应用这个函数来将c转换为remove函数。我尝试(删除(第一个过滤器f@coll)@coll)但什么也没发生。什么是“c”这里?扩展您的问题,包括您为
f
coll
传递的数据结构或函数。最好不要使用
f
作为任何非函数的名称。如果您解决了这些问题,您将看到其他人的代码。也许可以在删除问题上发布另一个问题这个问题有很多问题,很难直接回答。
user=> @coll
[0 1 2 3]
user=> (remove #(= % 2) @coll)
(0 1 3)