The following code contains an error, and I cannot figure out what it is at all. When I run StateMeta's test once, the statement marked with a comment above fails. When I run it again, it succeeds. This has been causing very weird bugs in my code. I've replicated the behavior in both a script and the REPL. Here's the bugged code:
(ns name.choi.joshua.fnparse [:use clojure.test]) (defprotocol ABankable (get-bank [o]) (vary-bank [o f & args])) (with-test (deftype StateMeta [bank index rule-stack] [clojure.lang.IPersistentMap]) (let [bank {:a 3} state-meta (StateMeta bank nil nil)] (is (= (get-bank state-meta) bank)) (is (= (get-bank (vary-bank state-meta identity)) bank)) ; This is the statement throwing an exception (is (= (get-bank (vary-bank state-meta assoc :b 2)) (assoc bank :b 2))))) (extend ::StateMeta ABankable {:get-bank :bank :vary-bank (fn vary-state-meta-bank [this f & args] (println ">>>>>>>>>" this f args) (apply update-in this [:bank] f args))}) --- Here is the behavior in a REPL by pasting in that code: Clojure 1.1.0-alpha-SNAPSHOT user=> (ns name.choi.joshua.fnparse [:use clojure.test]) (defprotocol ABankable (get-bank [o]) (vary-bank [o f & args])) (with-test (deftype StateMeta [bank index rule-stack] [clojure.lang.IPersistentMap]) (let [bank {:a 3} state-meta (StateMeta bank nil nil)] (is (= (get-bank state-meta) bank)) (is (= (get-bank (vary-bank state-meta identity)) bank)) (is (= (get-bank (vary-bank state-meta assoc :b 2)) (assoc bank :b 2))))) (extend ::StateMeta ABankable {:get-bank :bank :vary-bank (fn vary-state-meta-bank [this f & args] (println ">>>>>>>>>" this f args) (apply update-in this [:bank] f args))}) nil name.choi.joshua.fnparse=> name.choi.joshua.fnparse=> ABankable name.choi.joshua.fnparse=> name.choi.joshua.fnparse=> #'name.choi.joshua.fnparse/StateMeta name.choi.joshua.fnparse=> name.choi.joshua.fnparse=> name.choi.joshua.fnparse=> nil name.choi.joshua.fnparse=> name.choi.joshua.fnparse=> (test #'StateMeta) ERROR in clojure.lang.persistentlist$emptyl...@1 (NO_SOURCE_FILE:13) expected: (= (get-bank (vary-bank state-meta identity)) bank) actual: java.lang.IllegalArgumentException: Wrong number of args passed to: fnparse$eval--21$fn--33$G--9 at clojure.lang.AFn.throwArity (AFn.java:449) clojure.lang.AFn.invoke (AFn.java:56) name.choi.joshua.fnparse$eval__54$fn__84$fn__91.invoke (NO_SOURCE_FILE:13) name.choi.joshua.fnparse$eval__54$fn__84.invoke (NO_SOURCE_FILE: 13) clojure.core/test (core.clj:3125) name.choi.joshua.fnparse/eval (NO_SOURCE_FILE:24) clojure.lang.Compiler.eval (Compiler.java:4939) clojure.lang.Compiler.eval (Compiler.java:4907) clojure.core/eval (core.clj:1975) clojure.main$repl__7993$read_eval_print__8005.invoke (main.clj: 180) clojure.main$repl__7993.doInvoke (main.clj:197) clojure.lang.RestFn.invoke (RestFn.java:422) clojure.main/repl_opt (main.clj:251) clojure.main/legacy_repl (main.clj:292) clojure.lang.Var.invoke (Var.java:365) clojure.main.legacy_repl (main.java:27) clojure.lang.Repl.main (Repl.java:20) >>>>>>>>> #:StateMeta{:bank {:a 3}, :index nil, :rule-stack nil} >>>>>>>>> #<core$assoc__4564 clojure.core$assoc__4...@1a8773c> (:b 2) :ok name.choi.joshua.fnparse=> (test #'StateMeta) >>>>>>>>> #:StateMeta{:bank {:a 3}, :index nil, :rule-stack nil} >>>>>>>>> #<core$identity__5033 clojure.core$identity__5...@18d7ace> nil >>>>>>>>> #:StateMeta{:bank {:a 3}, :index nil, :rule-stack nil} >>>>>>>>> #<core$assoc__4564 clojure.core$assoc__4...@1a8773c> (:b 2) :ok --- This is absolutely stupefying. What in the world could it be? -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en