On Fri, Jan 27, 2012 at 2:41 PM, Bill Robertson
<[email protected]>wrote:
> I don't understand why the two functions below (recurs and transi) do
> not produce the same result. To the best of my understanding doseq
> will consume an entire sequence as demonstrated here:
>
> user=> (doseq [x (range 0 10)] (print x))
> 0123456789nil
>
> user=> *clojure-version*
> {:major 1, :minor 3, :incremental 0, :qualifier nil}
>
> user=> (defn recurs [dest src]
> (if-let [element (first src)]
> (recur (assoc dest element element) (rest src))
> dest))
> #'user/recurs
> user=> (count (recurs {} (range 0 20000)))
> 20000
>
> user=> (defn transi [dest src]
> (let [temp (transient dest)]
> (doseq [x src]
> (assoc! temp x x))
> (persistent! temp)))
> #'user/transi
> user=> (count (transi {} (range 0 20000)))
> 8
> user=> (count (transi {} (range 0 20)))
> 8
> user=> (count (transi {} (range 0 8)))
> 8
> user=> (count (transi {} (range 0 7)))
> 7
>
> Any ideas about why the first function does not behave the same as the
> second?
>
> Thanks
You can not bash transients like that. They must be operated on in a
functional way.
David
--
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