<div dir="ltr">On Fri, Jun 10, 2016 at 10:49 PM, Karl via swift-evolution <span dir="ltr">&lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt;</span> wrote:<br><div class="gmail_extra"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div style="word-wrap:break-word">I’m sorry, but those statistics are not useful. The Swift standard library is not representative of real-world Swift code, or what Swift developers expect or appreciate about the language. You also need to consider that lots of people are reluctant to support new syntax for fear that it might as soon disappear with the next drop (*uhum*…).</div></blockquote><div><br></div><div>More likely, lots of people don&#39;t know that this syntax exists. Earlier today we heard that one experienced Swift user didn&#39;t learn about the feature until joining this list!</div><div><br></div><div>Earlier, Jonathan Hull raised the example of stdlib `.forEach()`. Let&#39;s compare discoverability of these two features. For a method in the stdlib, I merely type `.` after the receiver in any IDE worth its salt, and I can find `.forEach()`. Or, say I&#39;m reading someone else&#39;s code. I see `.forEach()` and I click on it, and in any IDE worth its salt, I see all the info I need in a panel to the side. Now let&#39;s think about the discoverability of the `where` clause. I type `for foo in bar`--what tooling could I possibly use that would remind me about the `where` clause? Or let&#39;s say that I encounter the rare `for foo in bar where baz`, where do I click in Xcode for info on what `where` does? My best bet is to google &quot;Swift where&quot;!</div><div> </div><div>Of course, you might say, this is an argument for better tooling and better documentation. Sure. But it&#39;s also indicative of a fundamental distinction between library method names and language keywords. In essence: if it&#39;s a method, you&#39;re expected to look it up; if it&#39;s a keyword, you&#39;re assumed to know it. This has been the case for every language I&#39;ve encountered. So one question [not the only question] to ask here is: is the `where` clause so intuitive, or does it provide such utility, that we can rightly have that expectation of those who use loops (which, I&#39;m going to make a wild guess, is the set of all users)?</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div style="word-wrap:break-word">Gathering useful statistics about the popularity of features in the Swift language is more involved than simply grep-ing the standard library.<div><br></div><div>I know for a fact that it’s not representative of the code I’ve seen, or that I see people write, and it’s not reflective of that small amount of joy they feel when they realise basic, mundane stuff like this just works and stays readable. They’ve lived with C-loops and continues, Python list contractions and the like, and this is just better. </div></div></blockquote><div><br></div><div>I rather like Python list comprehensions--what&#39;s so terrible about them that they&#39;re merely to be &quot;lived with&quot;? If we take inspiration from Python, we might want to consider replacing `where` with `if` like you suggest below.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div style="word-wrap:break-word"><div>Somebody mentioned LINQ - that’s another sad story; It’s hard to reason about the performance characteristics of your code, and tiny, non-functional changes can have drastic impacts on performance. Making collections of data easy to filter is something a 21st-century programming language needs to do, and we could get things a whole lot “wronger” than a simple boolean predicate attached to “for&quot; loops.<div><br></div><div><br></div><div>There is something (which may have gotten lost in my mail): the “for _ in  _” loop is a data-driven loop. It’s unique compared to other loops such as “while” or “repeat/while”, which simply check a Bool condition. You don’t even have a loop counter, because your place in the list doesn’t matter - it’s about iterating over a collection of individual things. With that context, having the ability to filter inline is sort-of imperative.</div></div></div></blockquote><div><br></div><div>Not that this way of thinking is determinative, but of languages in the C family with `for...in` loops (including C++&#39;s range-for loop, etc.), how many have the ability to filter inline by the use of a keyword? I don&#39;t know of any. Not even Python, which has a filtering syntax for its list comprehensions. Many have a method such as .filter() [Rust] or .Where() [C#], as does Swift. This certainly doesn&#39;t mean that Swift *shouldn&#39;t* have a keyword, but it does suggest that it&#39;s not really &quot;imperative.&quot;</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div style="word-wrap:break-word"><div><div>I think its existence is entirely justified.</div><div><br></div><div>I would be more interested in discussing how exactly we could make it clearer than if it should exist at all. Personally, I have no attachment to the “where” keyword (I mean, I got it wrong practically every time in my mail, calling it “while”). But I’ve thought about alternatives and renaming (possible replace it with just “if”? as in “for number in 0..&lt;10 if number% 2 == 0 { print(“\(number) is an even number&quot;) }” ). I’m not sure I can think of something that’s clearly much better than what we have now.</div><div><br></div><div>Karl</div><div><br></div><div><div><div><blockquote type="cite"><div><div class="h5"><div>On 10 Jun 2016, at 17:24, Erica Sadun via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt; wrote:</div><br></div></div><div><div><div class="h5"><div style="font-family:Helvetica;font-size:12px;font-style:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><blockquote type="cite"><div><br>On Jun 10, 2016, at 9:22 AM, Erica Sadun via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt; wrote:</div><br><div><div style="word-wrap:break-word"><br><div><blockquote type="cite"><div>On Jun 10, 2016, at 8:02 AM, Xiaodi Wu via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt; wrote:</div><br><div><div dir="ltr">On Fri, Jun 10, 2016 at 7:18 AM, Haravikk<span> </span><span dir="ltr">&lt;<a href="mailto:swift-evolution@haravikk.me" target="_blank">swift-evolution@haravikk.me</a>&gt;</span><span> </span>wrote:<br><div class="gmail_extra"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div style="word-wrap:break-word"><div><span><blockquote type="cite"><div><div dir="ltr" style="font-family:Helvetica;font-size:12px;font-style:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><div class="gmail_extra"><div class="gmail_quote"><div>* The word &quot;where&quot; does not consistently imply `break` or `continue`. In current Swift, `where` implies `break` in the context of a `while` loop and `continue` in the context of a `for` loop. Some users intuitively guess the correct meaning in each context, while others guess the wrong meaning. Therefore, the only way to learn for sure what `where` means in any context is to read the rulebook. That, by definition, means that this is unintuitive.</div></div></div></div></div></blockquote><div><br></div></span><div>This is an argument for renaming the where keyword on for loops to be more clear, or to somehow integrate continue/break to be more explicit about what the developer intends for it to do.</div></div></div></blockquote><div><br></div><div>Sure: I conclude that the keyword should be *either* removed *or* reformed; both outcomes could address the issue.</div></div></div></div></div></blockquote><div><br></div>This is my stance as well and I reserve the right to flit between both choices until we&#39;ve fully talked it through.</div><div><br></div><div>One more data point. </div><div><br></div><div>In the standard library there are just under 950 uses of &quot;for in loops&quot;. There are 3 uses of &quot;for in while&quot; :</div><div><br></div><div><div><font face="Menlo">private/StdlibUnittest/StdlibUnittest.swift.gyb:    for j in instances.indices where i != j {</font></div><div><font face="Menlo">public/core/Algorithm.swift:  for value in rest where value &lt; minValue {</font></div><div><font face="Menlo">public/core/Algorithm.swift:  for value in rest where value &gt;= maxValue {</font></div><div><br></div><div>-- Erica</div></div></div></div></blockquote><br></div><div style="font-family:Helvetica;font-size:12px;font-style:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px">Actually a slight correction to that. I forgot to add the space after &quot;in&quot; on the first search. It&#39;s just over 600 and 3. Among the 600 are a few false positives but not many.</div><div style="font-family:Helvetica;font-size:12px;font-style:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><br></div><div style="font-family:Helvetica;font-size:12px;font-style:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px">-- E</div><div style="font-family:Helvetica;font-size:12px;font-style:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><br></div><div style="font-family:Helvetica;font-size:12px;font-style:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><br></div><div style="font-family:Helvetica;font-size:12px;font-style:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><br></div><br style="font-family:Helvetica;font-size:12px;font-style:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"></div></div><span class=""><span style="font-family:Helvetica;font-size:12px;font-style:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;float:none;display:inline!important">_______________________________________________</span><br style="font-family:Helvetica;font-size:12px;font-style:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><span style="font-family:Helvetica;font-size:12px;font-style:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;float:none;display:inline!important">swift-evolution mailing list</span><br style="font-family:Helvetica;font-size:12px;font-style:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><a href="mailto:swift-evolution@swift.org" style="font-family:Helvetica;font-size:12px;font-style:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px" target="_blank">swift-evolution@swift.org</a><br style="font-family:Helvetica;font-size:12px;font-style:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><a href="https://lists.swift.org/mailman/listinfo/swift-evolution" style="font-family:Helvetica;font-size:12px;font-style:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a></span></div></blockquote></div><br></div></div></div></div><br>_______________________________________________<br>
swift-evolution mailing list<br>
<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a><br>
<a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br>
<br></blockquote></div><br></div></div>