Lazy evaluation strikes again! map doesn't actually do anything until
you force it eg with dorun. This is quite a common mistake! Does
anyone know how one would go able making a warning be printed when a
lazy seq is created and thrown away without any evaluation? I'd be
interested in implementing it with some pointers on where to start
(I've read quite a lot of the code-base but well I'm not a language
expert).
To fix your problem:
(let [b (new StringBuffer)]
(dorun (map #(.append b (str % " ")) ["blah" "blah" "blah"]))
b)
I think it preferable to use doseq for side-effects:
(let [b (new StringBuffer)]
(doseq [s ["blah" "blah" "blah"]] (.append b (str s " "))
b)
Regards,
Tim.
On May 31, 10:47 am, Ben <[email protected]> wrote:
> I'm not sure if this is an issue or not. I broke it down to a simple
> case. When I pass a Java object into a map closure the object doesn't
> seem to get updated:
>
> (let [b (new StringBuffer)]
> (map #(.. b (append (str % " "))) '("blah" "blah" "blah")) b) ;=>
> #<StringBuffer >
>
> expected ;=> #<StringBuffer blah blah blah >
>
> I know it's doing working within map because if I take the ending b
> off I get
>
> (let [b (new StringBuffer)]
> (map #(.. b (append (str % " "))) '("blah" "blah" "blah")))
>
> ;=> (#<StringBuffer blah blah > #<StringBuffer blah blah blah >
> #<StringBuffer blah blah blah >)
>
> any ideas? Is this a bug or is this how it's supposed to work? I
> realize there are better ways to do this, but I wanted to create a
> simplified example of what I was noticing.
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
-~----------~----~----~----~------~----~------~--~---