删除/更新Clojure中的列表

时间:2016-01-30 15:13:35

标签: list clojure

我给了一个函数两个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功能正在获得一个名片和一手牌。

1 个答案:

答案 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)