<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class=""><div class=""><div class=""><font face="HelveticaNeue" class=""><b class="">Review of SE-0007</b></font></div><div class=""><font face="HelveticaNeue" class=""><b class=""><br class=""></b></font></div><div class=""><font face="HelveticaNeue" class=""><b class="">* What is your evaluation of the proposal?</b></font></div><div class=""><font face="HelveticaNeue" class=""><br class=""></font></div><div class=""><font face="HelveticaNeue" class="">I am against this change. I’ve seen no consideration of the performance implications that this change brings about. Also, many of the proposed alternatives tend towards using defer as the mechanism to provide consistent increments/decrements. However, this is problematic around the boundary edges as break and throw are not mechanisms that can halt the execution of the defer statement. So unlike the c-style loop that would not perform that code, the alternatives would.</font></div><div class=""><font face="HelveticaNeue" class=""><br class=""></font></div><div class=""><font face="HelveticaNeue" class=""><b class="">* Is the problem being addressed significant enough to warrant a change to Swift?</b></font></div><div class=""><font face="HelveticaNeue" class=""><br class=""></font></div><div class="">No; it offers no alternative solution to maintain the performance that a c-style for-loop ensures. There is no general pattern than can be used to satisfy a c-style loop’s behavior; each proposed alternative has different issues.</div><div class=""><font face="HelveticaNeue" class=""><br class=""></font></div><div class=""><font face="HelveticaNeue" class=""><b class="">* Does this proposal fit well with the feel and direction of Swift?</b></font></div><div class=""><font face="HelveticaNeue" class=""><br class=""></font></div><div class=""><font face="HelveticaNeue" class="">No, it limits the language’s ability to create concise and legible code when the situation does arise for a c-style loop.</font></div><div class=""><font face="HelveticaNeue" class=""><br class=""></font></div><div class=""><font face="HelveticaNeue" class="">This is the alternative to create a loop that matches the same functionality, including preventing the leaking of loop-variables.</font></div><div class=""><font face="HelveticaNeue" class=""><br class=""></font></div></div></div><blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;" class=""><div class=""><div class=""><div class=""><font class="" face="Menlo">var&nbsp;sum =&nbsp;0</font></div></div></div><div class=""><div class=""><div class=""><font class="" face="Menlo">for&nbsp;var&nbsp;i =&nbsp;1000, j =&nbsp;2000; i &gt;&nbsp;0&nbsp;&amp;&amp; j &gt;&nbsp;0; i -=&nbsp;1, j -=&nbsp;2&nbsp;{</font></div></div></div><div class=""><div class=""><div class=""><font class="" face="Menlo">&nbsp; &nbsp; if&nbsp;i %&nbsp;2&nbsp;==&nbsp;0&nbsp;{&nbsp;continue&nbsp;}</font></div></div></div><div class=""><div class=""><div class=""><font class="" face="Menlo">&nbsp; &nbsp; sum +=&nbsp;1</font></div></div></div><div class=""><div class=""><div class=""><font class="" face="Menlo">}</font></div></div></div><div class=""><div class=""><div class=""><font class="" face="Menlo">print(sum)</font></div></div></div></blockquote><div class=""><div class=""><div class=""><font face="HelveticaNeue" class=""><br class=""></font></div><div class=""><font face="HelveticaNeue" class="">// versus<br class=""><br class=""></font></div></div></div><blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;" class=""><div class=""><div class=""><div class=""><font class=""><font face="Menlo" class="">var&nbsp;sum =&nbsp;0</font></font></div></div></div><div class=""><div class=""><div class=""><font class=""><font face="Menlo" class=""><br class=""></font></font></div></div></div><div class=""><div class=""><div class=""><font class=""><font face="Menlo" class="">if true { // some arbitrary scope mechanism is needed to contain i and j</font></font></div></div></div><div class=""><div class=""><div class=""><font class=""><font face="Menlo" class="">&nbsp; &nbsp;&nbsp;var&nbsp;i =&nbsp;1000, j =&nbsp;2000</font></font></div></div></div><div class=""><div class=""><div class=""><font class=""><font face="Menlo" class="">&nbsp; &nbsp;&nbsp;while&nbsp;i &gt;&nbsp;0&nbsp;&amp;&amp; j &gt;&nbsp;0&nbsp;{</font></font></div></div></div><div class=""><div class=""><div class=""><font class=""><font face="Menlo" class="">&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;defer&nbsp;{</font></font></div></div></div><div class=""><div class=""><div class=""><font class=""><font face="Menlo" class="">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;i -=&nbsp;1</font></font></div></div></div><div class=""><div class=""><div class=""><font class=""><font face="Menlo" class="">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;j -=&nbsp;2</font></font></div></div></div><div class=""><div class=""><div class=""><font class=""><font face="Menlo" class="">&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;}</font></font></div></div></div><div class=""><div class=""><div class=""><font class=""><font face="Menlo" class="">&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</font></font></div></div></div><div class=""><div class=""><div class=""><font class=""><font face="Menlo" class="">&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;if&nbsp;i %&nbsp;2&nbsp;==&nbsp;0&nbsp;{&nbsp;continue&nbsp;}</font></font></div></div></div><div class=""><div class=""><div class=""><font class=""><font face="Menlo" class="">&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;sum +=&nbsp;1</font></font></div></div></div><div class=""><div class=""><div class=""><font class=""><font face="Menlo" class="">&nbsp; &nbsp;&nbsp;}</font></font></div></div></div><div class=""><div class=""><div class=""><font class=""><font face="Menlo" class="">}</font></font></div></div></div><div class=""><div class=""><div class=""><font class=""><font face="Menlo" class=""><br class=""></font></font></div></div></div><div class=""><div class=""><div class=""><font class=""><font face="Menlo" class="">print(sum)</font></font></div></div></div></blockquote><div class=""><div class=""><div class=""><br class=""></div><div class=""><font face="HelveticaNeue" class="">To me, that is not a fair trade-off; maybe if the defer pattern could be used at all times and the leaking of the loop-variables was considered ok. There are some ways to consolidate the code so that it takes up less visual space, but I don’t do that for other constructs, so I don’t think that is a valid thing to try and do here. Also, the use of defer in this context is a somewhat of a trick that I’m not sure is even a good pattern to promote as it can lead to boundary-case crashes.</font></div><div class=""><font face="HelveticaNeue" class=""><br class=""></font></div><div class=""><font face="HelveticaNeue" class="">This is unsafe code:</font></div><div class=""><font face="HelveticaNeue" class=""><br class=""></font></div></div></div><blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;" class=""><div class=""><div class=""><div class=""><font class=""><div class=""><div class=""><div class=""><font face="Menlo" class="">var&nbsp;sum =&nbsp;0</font></div></div></div></font></div></div></div><div class=""><div class=""><div class=""><font class=""><div class=""><div class=""><div class=""><font face="Menlo" class="">var&nbsp;i:&nbsp;UInt&nbsp;=&nbsp;1000</font></div></div></div></font></div></div></div><div class=""><div class=""><div class=""><font class=""><div class=""><div class=""><div class=""><font face="Menlo" class="">while&nbsp;i&nbsp;&gt;=&nbsp;0&nbsp;{</font></div></div></div></font></div></div></div><div class=""><div class=""><div class=""><font class=""><div class=""><div class=""><div class=""><font face="Menlo" class="">&nbsp; &nbsp;&nbsp;defer&nbsp;{</font></div></div></div></font></div></div></div><div class=""><div class=""><div class=""><font class=""><div class=""><div class=""><div class=""><font face="Menlo" class="">&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;i&nbsp;-=&nbsp;1</font></div></div></div></font></div></div></div><div class=""><div class=""><div class=""><font class=""><div class=""><div class=""><div class=""><font face="Menlo" class="">&nbsp; &nbsp;&nbsp;}</font></div></div></div></font></div></div></div><div class=""><div class=""><div class=""><font class=""><div class=""><div class=""><div class=""><font face="Menlo" class="">&nbsp; &nbsp;&nbsp;if&nbsp;i&nbsp;==&nbsp;0&nbsp;{</font></div></div></div></font></div></div></div><div class=""><div class=""><div class=""><font class=""><div class=""><div class=""><div class=""><font face="Menlo" class="">&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;print("zero has been reached!")</font></div></div></div></font></div></div></div><div class=""><div class=""><div class=""><font class=""><div class=""><div class=""><div class=""><font face="Menlo" class="">&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;break</font></div></div></div></font></div></div></div><div class=""><div class=""><div class=""><font class=""><div class=""><div class=""><div class=""><font face="Menlo" class="">&nbsp; &nbsp;&nbsp;}</font></div></div></div></font></div></div></div><div class=""><div class=""><div class=""><font class=""><div class=""><div class=""><div class=""><font face="Menlo" class=""><br class=""></font></div></div></div></font></div></div></div><div class=""><div class=""><div class=""><font class=""><div class=""><div class=""><div class=""><font face="Menlo" class="">&nbsp; &nbsp;&nbsp;if&nbsp;i&nbsp;%&nbsp;2&nbsp;==&nbsp;0&nbsp;{&nbsp;continue&nbsp;}</font></div></div></div></font></div></div></div><div class=""><div class=""><div class=""><font class=""><div class=""><div class=""><div class=""><font face="Menlo" class="">&nbsp; &nbsp;&nbsp;sum&nbsp;+=&nbsp;1</font></div></div></div></font></div></div></div></blockquote><blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;" class=""><div class=""><div class=""><div class=""><font class=""><div class=""><div class=""><div class=""><font face="Menlo" class="">}</font></div></div></div></font></div></div></div></blockquote><div class=""><div class=""><div class=""><font class=""><div class=""><div class=""><div class=""><font face="Menlo" class=""><br class=""></font></div></div></div><div class="" style="font-family: Helvetica;"><div class=""></div></div></font></div><div class=""><font face="HelveticaNeue" class="">The defer statement is still executed, so now I need to come up with a different pattern to handle this type of problem.</font></div><div class=""><font face="HelveticaNeue" class=""><br class=""></font></div><div class=""><font face="HelveticaNeue" class=""><b class="">* If you have you used other languages or libraries with a similar feature, how do you feel that this proposal compares to those?</b></font></div><div class=""><font face="HelveticaNeue" class=""><br class=""></font></div><div class=""><font face="HelveticaNeue" class="">n/a</font></div><div class=""><font face="HelveticaNeue" class=""><br class=""></font></div><div class=""><font face="HelveticaNeue" class=""><b class="">* How much effort did you put into your review? A glance, a quick reading, or an in-depth study?</b></font></div><div class=""><br class=""></div></div></div><div class="">A few hours. I’ve read the proposal multiple times and followed the mail threads. I’ve also done some basic performance analysis (attached mail) on the problem for some of the “improved” versions of the loop construct.</div><div class=""><br class=""></div><div class="">-David</div><div class=""><br class=""></div><div class=""></div></body></html>