I have read (doc transient), (doc assoc!) and (doc persistent!), and I
don't see what I'm missing, which is why I came here for help.
To my understanding, the first creates a transient collection, which
cannot be used in other threads, and cannot be used after converting
back to a persistent collection.
user=> (doc assoc!)
-------------------------
clojure.core/assoc!
([coll key val] [coll key val & kvs])
Alpha - subject to change.
When applied to a transient map, adds mapping of key(s) to
val(s). When applied to a transient vector, sets the val at index.
Note - index must be <= (count vector). Returns coll.
assoc!'s doc says that it adds mapping of keys to values when applied
to a map, which is what this code demonstrates.
user=> (def t (transient {}))
#'user/t
user=> (assoc! t 1 1)
#<TransientArrayMap clojure.lang.PersistentArrayMap
$TransientArrayMap@1352367>
user=> (assoc! t 2 2)
#<TransientArrayMap clojure.lang.PersistentArrayMap
$TransientArrayMap@1352367>
user=> (def p (persistent! t))
#'user/p
user=> p
{1 1, 2 2}
It says that it returns col. Does that imply that I'm supposed to hang
on to col?
On Jan 27, 3:50 pm, Kevin Downey <[email protected]> wrote:
> Please don't use transients unless you read and understand the
> documentation.
> On Jan 27, 2012 12: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 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
--
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