>>>> 1. Presumably these are all for-in-able.  What makes something
>>>> for-in-able?
>>> 
>>> I would think the potentially infinite should require for-in-until
>>> (even if you explicitly set until to false to create an infinite
>>> loop), but collection would allow for-in (with optional until).  That
>>> way you have to acknowledge the possibility of an infinite
>>> sequence/iterator.
>> 
>> Are you proposing a new language feature?  
> 
> That was my impression.  It’s an interesting idea.  It wouldn’t guarantee 
> termination but would require developers to consider termination and 
> therefore prevent accidents, which are the concerns I am raising.

Yes, exactly.

>> We could also do this with
>> 
>>   for i in allIntegers.until(isPrime)
> 
> Is `until` lazy or eager here?  I imagine you’re thinking it would be lazy 
> because making it eager would introduce unnecessary allocation.  However, if 
> it’s lazy it is an exception to the explicit laziness Swift has adopted.  
> 
> Wouldn’t it be better to require explicit laziness `allIntegers.lazy.until` 
> if for..in is going to be require finite sequences and we’re going to use a 
> library solution to support infinite sequences?  It’s more verbose but more 
> consistent with how laziness is currently handled.  It also doesn’t privilege 
> any specific operator (which isn’t necessary if we do this in the library).  

Everything with Iterators / Sequences should be lazy (because that is the only 
safe thing).  Collections would most likely still be eager.

In this case, ‘until' is creating a collection (most likely an array), so it 
would be eager.  For an iterator, it would immediately drain and buffer it.  
For a sequence, I guess it is whatever is most efficient.

> If we went with a language solution I imagine it would look something like 
> this:
> 
> for i in allIntegers until i.isPrime && i > 1000 where i.isEven {
>    // all even integers < the first prime > 1000
> }
> 
> IIRC the `until` clause has already been discussed as syntactic sugar for 
> early termination.  Its utility wouldn’t be limited to looping over infinite 
> sequences, however it would be *required* when you loop over an infinite 
> sequence.  

Yeah, that is my thought as well.  I would also be ok with Dave’s suggestion as 
long as the path (compiler complain -> Suggest Fix) is the same, so you still 
consider and deal with the infinite case.

I do like the look of the language feature better, of course...

> This sugar wouldn’t have to be introduced in Swift 3.  We could make for..in 
> require finite sequences in Swift 3 and add it later if there is sufficient 
> demand.  In the meantime people could iterate infinite sequences manually and 
> / or we could add library support via lazy operators that select a prefix (if 
> we are willing to live with the fact that in practice termination may depend 
> on arguments to the operator).

Ah, I just saw your point above.  allIntegers.until(isPrime) most likely needs 
to be eager, but that is the opposite of what we want for a for-in loop (it 
could have an early break), so the language feature might be quite a bit more 
efficient, and might actually be worthwhile (especially considering that people 
were already asking for it anyway).  I was indifferent to it, but I like it for 
this case…

Anyway, I am interested to see what they are cooking up for us (It may be much 
better than this)...

Thanks,
Jon

_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to