Brian Craft <craft.br...@gmail.com> writes:

Hi Brian,

> I just came across this example in "Clojure Programming", chapt 4:
>
> (def ^:dynamic *max-value* 255)
> (defn valid-value? [v] (<= v *max-value*))
>
> (binding [*max-value* 500] (map valid-value? [299]))
> ;= (false)
>
> It's not really explained in the text. I'm guessing this happens because 
> when the (binding...) expression is evaluated, it merely returns the head 
> of the seq. The values of the seq aren't evaluated until the repl 
> implicitly realizes the return value.

Right.

> The workaround in the book is to move the "binding" into the map
> function, though I would think "doall" would be a better solution.
>
> (binding [*max-value* 500] (doall (map valid-value? [299])))
> ;= (true)
>
> This seems like the same issue that comes up with libraries that
> implement a with-<blah> API: with-db, and so-forth. You have to walk
> any seqs within the binding form if the binding is to have any affect
> on the values in the seqs.

Another way is to use `bound-fn' which has the benefit that you don't
need to realize the complete lazy seq in advance:

  (binding [*max-value* 500]
    (map (bound-fn [x] (valid-value? x)) [299]))

Bye,
Tassilo

-- 
-- 
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
--- 
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to