Re: Fail to run dynamic binding code with Clojure1.4

60 views
Skip to first unread message

gaz jones

unread,
Oct 30, 2012, 9:35:48 PM10/30/12
to clo...@googlegroups.com
As of Clojure 1.3 you need to mark things you with to re-bind
explicitly as dynamic:

(defn ^:dynamic twice [x]
...)


On Tue, Oct 30, 2012 at 7:42 PM, Satoru Logic <sator...@gmail.com> 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 clo...@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+u...@googlegroups.com
> For more options, visit this group at
> http://groups.google.com/group/clojure?hl=en

Andy Fingerhut

unread,
Oct 30, 2012, 9:36:37 PM10/30/12
to clo...@googlegroups.com
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

Sean Corfield

unread,
Oct 30, 2012, 11:26:29 PM10/30/12
to clo...@googlegroups.com
Yes, it's very unfortunate that Manning released Clojure in Action
without a final pass to make it Clojure 1.3 compatible. I talked to
them about it when they still had time to make changes but they
decided to go ahead and publish a book that is tightly wedded to
Clojure 1.2 after Clojure 1.3 had been released. I think it was a
disservice to both the author and the community :(

Sean

Satoru Logic

unread,
Oct 30, 2012, 11:38:32 PM10/30/12
to clo...@googlegroups.com
Could you please recommend a book that's more up-to-date?

Satoru Logic

unread,
Oct 30, 2012, 11:39:36 PM10/30/12
to clo...@googlegroups.com
Does this mean vars are dynamic by default prior to Clojure1.3, and lexical afterwards?

Sean Corfield

unread,
Oct 31, 2012, 12:41:09 AM10/31/12
to clo...@googlegroups.com
On Tue, Oct 30, 2012 at 8:38 PM, Satoru Logic <sator...@gmail.com> wrote:
> Could you please recommend a book that's more up-to-date?

Clojure Programming http://www.clojurebook.com/ would be my first choice.

Programming Clojure 2nd Edition
http://pragprog.com/book/shcloj2/programming-clojure would be my
second choice.

The Joy of Clojure http://manning.com/fogus/ is an older book but is
more high-level - the "why" of functional programming - so it's still
applicable to more recent Clojure versions, but definitely a book for
when you have more Clojure under your belt.
--
Sean A Corfield -- (904) 302-SEAN
An Architect's View -- http://corfield.org/
World Singles, LLC. -- http://worldsingles.com/

"Perfection is the enemy of the good."
-- Gustave Flaubert, French realist novelist (1821-1880)

Satoru Logic

unread,
Oct 31, 2012, 1:04:56 AM10/31/12
to clo...@googlegroups.com
Thanks
Reply all
Reply to author
Forward
0 new messages