On Tue, May 26, 2015 at 11:29 PM Alex Miller <a...@puredanger.com> wrote:
> The point I was getting at is really whether you should consider this to > be broken with the old behavior too. > Such APIs are tricky to use correctly from Clojure via seqs, but it is possible to do so with the "normal" automatic clojure.lang.RT seq adapters in Clojure <=1.6. My point is that existing Clojure code can and does depend on non-chunked realization of iterator seqs, and that for such code this is a breaking change. > Can you point to code for "the original behavior allowed room to transform > the mutated object into an object which *could* be safely cached in a > 'downstream' seq"? By what means does this transformation occur? It sounds > to me like you are starting with an Iterator, creating a seq, then walking > the seq exactly once, one element at a time, and producing a new > transformed seq or other output. > Exactly -- the unfortunately Java <=1.6-only snippet I posted earlier is just such an example of this. > If you did reuse that IteratorSeq, all of the elements of the sequence > would point to the same object which would be in the "last" state like the > java 1.6 example you gave. Thus, the "caching" capability of the seq can't > possibly be something you're using. And if that's true, then why are you > paying the allocation and synchronization costs of making the seq at all? > Why not just use the iterator directly, thus skipping all the extra > allocation that these object-reusing high-performance iterators are working > so hard to avoid in the first place? In 1.7, transducers would give you > exactly the capability to walk the source iterator, apply a transducer > version of your transformation, and output to a collection (via into), a > value (via transduce), or a lazy sequence (via sequence). I think you would > find this faster as well due to reduced allocation (possibly greatly > reduced depending on the transformation). > I've personally used reducers wherever possible since they were introduced, and for the Hadoop case Parkour's primary recommended API is in terms of reducers [1]. For new code, the transducer-based facilities in Clojure 1.7 will certainly provide more options for functional-safe handling of the iterators at question. But to repeat my main point, those don't help with existing code which depends on the one-at-a-time realization semantics of Iterators being reflected in one-at-a-time realization in iterator-backed seqs. [1] https://github.com/damballa/parkour/blob/master/doc/reducers-vs-seqs.md Thanks, -Marshall -- 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/d/optout.