Clojure 在deftype中使用原子时出现奇怪的错误

Clojure 在deftype中使用原子时出现奇怪的错误,clojure,Clojure,我有下面的代码,定义了一个包含atom的类型 (defprotocol IDeck (vec-* [dk] "Output to a persistent vector") (count-* [dk] "Number of elements in the deck") (conj1-* [dk & es] "Adding multiple elements to the deck")) (deftype ADeck [#^clojure.lang.Atom val] IDe

我有下面的代码,定义了一个包含atom的类型

(defprotocol IDeck (vec-* [dk] "Output to a persistent vector") (count-* [dk] "Number of elements in the deck") (conj1-* [dk & es] "Adding multiple elements to the deck")) (deftype ADeck [#^clojure.lang.Atom val] IDeck (vec-* [dk] (->> (.val dk) deref (map deref) vec)) (count-* [dk] (-> (.val dk) deref count)) (conj1-* [dk & es] (try (loop [esi es] (let [e (first esi)] (cond (nil? e) dk :else (do (swap! (.val dk) #(conj % (atom e))) (recur (rest esi)))))) (catch Throwable t (println t))))) (defn new-*adeck ([] (ADeck. (atom []))) ([v] (ADeck. (atom (vec (map atom v)))))) (defn conj2-* [dk & es] (try (loop [esi es] (let [e (first esi)] (cond (nil? e) dk :else (do (swap! (.val dk) #(conj % (atom e))) (recur (rest esi)))))) (catch Throwable t (println t)))) ;; Usage (def a (new-*adeck [1 2 3 4])) (count-* a) ;=> 4 (vec-* a) ;=> [1 2 3 4] (conj1-* a 1 2) ;; The deftype case ;=> IllegalArgumentException java.lang.IllegalArgumentException: Don't know how to create ISeq from: java.lang.Long (vec-* a) ;=> [1 2 3 4] (conj2-* a 1 2) ;; The defn case (vec-* a) ;=> [1 2 3 4 1 2] (defideck协议) (vec-*[dk]“输出到持久性向量”) (计数-*[dk]“甲板中的构件数量”) (cong1-*[dk&es]“向甲板添加多个元素”)) (deftype ADeck[#^clojure.lang.Atom val] 艾迪克 (vec-*[dk](>>(.val dk)deref(map deref)vec)) (计数-*[dk](>(.val dk)deref计数)) (1-*[dk&es] (试试看 (循环[esi es] (让[e(第一esi)] (续) (无?e)丹麦 :其他 (做 (swap!(.val dk)#(conj%(原子e))) (再次出现(其余esi()()))) (捕捉可丢弃的t(println t(()()))) (新定义-*阿德克 ([](阿德克(原子[])) ([v](ADeck.(原子)(vec(映射原子v()())))) (定义2-*[dk&es] (试试看 (循环[esi es] (让[e(第一esi)] (续) (无?e)丹麦 :其他 (做 (swap!(.val dk)#(conj%(原子e))) (再次出现(其余esi()()))) (捕捉可丢弃的t(println t))) ;; 用法 (def a(新-*adeck[1 2 3 4])) (计数-*a) ;=> 4. (vec-*a) ;=> [1 2 3 4] (1-*a 12);;deftype案例 ;=> IllegalArgumentException java.lang.IllegalArgumentException:不知道如何从以下位置创建ISeq:java.lang.Long (vec-*a) ;=> [1 2 3 4] (2-*a 12);;德芬案 (vec-*a) ;=> [1 2 3 4 1 2]
尽管这两个conj-*方法完全相同,只是其中一个是deftype,另一个是normaldefn,但第一个方法给出错误,而第二个方法成功。为什么会这样?

这是因为协议不支持可变数量的参数

您可以做的是:

(conj1-*  [dk & es] "Adding multiple elements to the deck"))
进入

这样es参数将是向量,并被称为:

(conj1-* a [1 2])
(conj1-* a [1 2])