Huh.  That raises the question "Why doesn't 
clojure.lang.ITransientCollection extend clojure.lang.IEditableCollection, 
so the .asTransient method is idempotent?"  Would that make a circular 
reference?
--Leif

On Tuesday, March 20, 2012 3:32:28 PM UTC-7, Andy Fingerhut wrote:
>
> Sorry, I said something incorrect.  into cannot take transients as the 
> first arg.  It calls transient internally on the first arg for speed.  This 
> does not modify the value you passed in at all -- it creates a new 
> transient data structure from what you pass in.
>
> If you try calling transient on a data structure that is already a 
> transient, you get an error.  Thus this gives an error:
>
> user=> (def x [1 2 3])
> #'user/x
> user=> (def tx (transient x))
> #'user/tx
> user=> (into tx [5 6 7])
> ClassCastException clojure.lang.PersistentVector$TransientVector cannot be 
> cast to clojure.lang.IPersistentCollection  clojure.core/conj (core.clj:83)
> user=> (into x [5 6 7])
> [1 2 3 5 6 7]
>
> Andy
>
>
> On Mar 20, 2012, at 11:30 AM, Andy Fingerhut wrote:
>
> func! (bang) is a naming convention from the programming language Scheme 
> that Clojure often uses.  In general it means that the function mutates 
> data, i.e. it is not a pure function.  Clojure does not have a ! after all 
> of its core functions that do this, but it does after some.  In particular, 
> the functions that operate on transients like conj! assoc! persistent! etc. 
> mutate their arguments.
>
> Many (maybe most) regular collection functions do not take transients.  As 
> I said, I think it is an accident, not by design, that 'into' can take a 
> transient as an argument.  Originally it only took persistent collections 
> as arguments (perhaps also seqs, but those are immutable, too).
>
> Andy
>
> On Mar 20, 2012, at 11:17 AM, László Török wrote:
>
> Ok,
>
> so the pattern is:
>
> func! (bang) takes a transient and returns a transient
>
> regular collection functions MAY take a transient but ALWAYS return a 
> persistent collection, right? :)
>
> thx
> Las
>
> 2012/3/20 Andy Fingerhut <andy.finger...@gmail.com>
>
>> into uses transient and persistent! for speed.  The fact that into can 
>> take a transient as input is an accidental consequence of that, I think. 
>>  Before into was changed to use transients internally, it could only take 
>> persistent data structures as input, and return a persistent data structure.
>>
>> Andy
>>
>> On Mar 20, 2012, at 10:32 AM, László Török wrote:
>>
>> Hi,
>>
>> While implementing qsort with clojure for fun, I thought about using 
>> transient vectors to speed up sorting vs the "naive" functional 
>> implementation.
>>
>> I need an *into!* version of *into *when joining two sorted subarrays 
>> and I was wondering why there isn't one.
>>
>> It seems that (source into) does in fact support a transient collection 
>> as the first argument, however it calls persistent! on the result.
>>
>> What was the rationale behind the decision? (Note: I'm not questioning 
>> it, just interested.)
>> Is there a particular reason why this feature remains undocumented? 
>>
>> -- 
>> László Török
>>
>>
>> -- 
>> 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 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
>
>
>
>
> -- 
> László Török
>
>
> -- 
> 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 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