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

Reply via email to