Does this mean vars are dynamic by default prior to Clojure1.3, and lexical 
afterwards?

On Wednesday, October 31, 2012 9:36:47 AM UTC+8, Andy Fingerhut wrote:
>
> 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

Reply via email to