我给了一个函数两个args,一个从列表和集合中删除的元素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功能正在获得一个名片和一手牌。
答案 0 :(得分:0)
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)