> On Mar 23, 2016, at 6:46 PM, Dany St-Amant via swift-evolution > <[email protected]> wrote: > > >> Le 22 mars 2016 à 21:19, William Dillon <[email protected] >> <mailto:[email protected]>> a écrit : >> >>> >>> These may be compact, but some programmer may fell that they are not in >>> control: do these "stdlib" seq(), c.filter() pre-calculate all the entries >>> (wasting precious cpu cycle if one break out early) or are each value >>> dynamically created? Having an explicit legacy loop format gives a feel of >>> control. So something like >>> >>> for i from 2 to 1_000_000 by 1 where i % 2 != 0 while foundCount < 5 { >>> print(i); foundCount +=1 } >>> >>> sounds less magical and seems easier to predict than >>> >>> for i in 2.stride(to:1_000_000, by:1).filter({ $0 % 2 != 0}).prefix(5) { >>> print(i) } >>> >>> and is still quite readable, even if it mixes for loop, while loop and even >>> simple condition. >>> >> >> I disagree. I think the first case is venturing dangerously close to the >> AppleScript “uncanny valley” of human language-like programming verbs where >> I never know the exact words and exact order for things. The second example >> is right out of any functional programming mold, and I fully understand >> what’s happening, and how to decompose the process to test assumptions. >> Also, I know how to implement the second case (more or less) from scratch, >> and that’s pretty huge for me. >> > > There have been multiple fights over too verbose versus too terse, and on > whether or not making it sound like English. I would agree a verbose syntax > for a mandatory statement is a pain, but the while and where above are > optional. And using them instead of relying on continue or break allow for > code intent to be bit clearer. > > Reusing my bad example, without the from/to/by: > > for i in 2.stride(to: 1_000_000, by: 1) > { > if i % 2 != 0 { continue } > print(i) > foundCount += 1 > if foundCount >= 5 { break } > } > > // Where clause already work in current Swift > for i in 2.stride(to: 1_000_000, by: 1) > where i % 2 == 0 > { > print(i) > foundCount += 1 > if foundCount >= 5 { break } > } > > // While do not exist yet in this context > for i in 2.stride(to: 1_000_000, by: 1) > where i % 2 == 0 > while foundCount < 5 > { > print(i) > foundCount += 1 > } >
The ‘where’ I can tolerate because there are other examples of such a construct in other parts of the language. The while part is still problematic, because where have you declared it? Do you think declaring a variable for that somewhere outside the context of the loop is cleaner than leaving it entirely within that scope then doing a test and break? - Will
_______________________________________________ swift-evolution mailing list [email protected] https://lists.swift.org/mailman/listinfo/swift-evolution
