(defn character
[name & {:as opts}]
(ref (merge {:name name :itmes #{} :health 500}
opts)))
(def smaug (character "Smaug" :health 500 :strength 400 :items (set (range 50))))
(def bilbo (character "Bilbo" :health 100 :strength 100))
(def gandalf (character "Gandalf" :health 75 :mana 750))
(defn loot
[from to]
(dosync
(when-let [item (first (:items @from))]
(alter to update-in [:items] conj item)
(alter from update-in [:items] disj item))))
(wait-futures 1
(while (loot smaug bilbo))
(while (loot smaug gandalf)))
(map (comp count :items deref) [bilbo gandalf])
(filter (:items @bilbo) (:items @gandalf))
一切正常,直到最后一行,这会引发错误:
ClassCastException clojure.lang.PersistentList cannot be cast to clojure.lang.IFn clojure.core/filter/fn--4264 (core.clj:2605)
答案 0 :(得分:3)
构造函数“character”拼写错误:items as:itmes,使alter on alter get nil作为初始值。 Conjing nil和一个值给你一个列表 - 因此是ClassCastException。
答案 1 :(得分:3)
您的角色定义中似乎有一个拼写错误 - :itmes
而不是:items
。
这意味着当你掠夺时,你正在打电话
(conj nil 0)
,将:items
下的条目转换为(0)
列表。列表未实现IFn
,因此错误。