[swift-evolution] Stdlib closure argument labels and parameter names
Dave Abrahams
dabrahams at apple.com
Tue Jun 28 00:07:07 CDT 2016
on Mon Jun 27 2016, Patrick Smith <pgwsmith-AT-gmail.com> wrote:
> Side question: is there going to be any situation where I’m iterating
> through a sequence/collection that I wouldn’t want to always use
> `lazy`? Is `lazy` *always* going to be more efficient than the
> array-creating defaults when the result is iterated?
If all you're going to do is iterate over it at most once, then yeah,
the lazy version will pretty much always be more efficient. If anything
you do with the lazy result makes multiple passes (including
constructing an array if it is a collection with O(N) count, like the
result of a lazy filter), then you have to be prepared for the closures
you use to be called multiple times.
> For instance, something much better than this terrible syntax:
>
> for a in sequence where .filter({ $0 > 5 }).map({ $0 * 2 }) {
> print(a)
> }
I don't know what that's supposed to illustrate.
> It would be up to the compiler what calls it turns that into, possibly
> it could make a certain whitelist of transformations (filter, map) as
> efficient as using `for … where` or `guard` today? Or it could simply
> make use of `lazy`.
>
> `for` is already hiding ‘magic’ by calling `makeIterator()`, why can’t
> it do more ‘magic’, especially since `lazy` is a member of `Sequence`
> just like `makeIterator()`.
>
> Anyway, something for the future after Swift 3.0.
It's an interesting thought, yes.
--
Dave
More information about the swift-evolution
mailing list