The code works as written in Clojure 1.2 and 1.2.1. It doesn't in 1.3 and later, unless you change the definition of twice to annotate that it is a dynamic var, like so:
(defn ^:dynamic twice [x] (println "original function") (* 2 x)) With that change, it works in Clojure 1.3 and later. Andy On Oct 30, 2012, at 5:42 PM, Satoru Logic wrote: > Hi, all. > > I am reading Clojure in Action. > > In the "scope" section of Chapter3, there are examples like this: > > defn twice [x] > (println "original function") > (* 2 x)) > (defn call-twice [y] > (twice y)) > (defn with-log [function-to-call log-statement] > (fn [& args] > (println log-statement) > (apply function-to-call args))) > > (call-twice 10) > > (binding [twice (with-log twice "Calling the twice function")] > (call-twice 20)) > > (call-twice 30) > > When I tried to run this code in repl, I got the following exception: > > IllegalStateException Can't dynamically bind non-dynamic var: user/twice > clojure.lang.Var.pushThreadBindings (Var.java:353) > > Is the book wrong or I'm running with the wrong version of clojure? -- 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