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 [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en