I like most of that and don&#39;t object to the rest, except for leaving out a version of #:break-unless.  Especially because &quot;break&quot; is already a negative word.  Just like #:unless (bad?) is more natural than #:when (not (bad?)), #:&lt;something&gt; (ok-to-continue?) is more natural than #:break (not (ok-to-continue?)).  I&#39;d suggest &quot;#:continue&quot;, but in C-like languages I believe that means something different.<br>

<br>Actually, we could make the whole thing more positive (or, ironically, less negative) by going with #:do-while and #:do-until, something like that.  It brings back the nicely mnemonic &quot;while&quot; and &quot;until&quot;, is hard to confuse with &quot;when&quot; and &quot;unless&quot;, and &quot;do&quot; isn&#39;t that much extra to read.  And it&#39;s positive, so it doesn&#39;t reverse the meaning of the second word.<br>

<br clear="all">Carl Eastlund<br>
<br><div class="gmail_quote">On Fri, Sep 14, 2012 at 4:25 PM, Matthew Flatt <span dir="ltr">&lt;<a href="mailto:mflatt@cs.utah.edu" target="_blank">mflatt@cs.utah.edu</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

<div class="im">At Fri, 14 Sep 2012 15:30:22 -0400, Eli Barzilay wrote:<br>
&gt; Four hours ago, Matthew Flatt wrote:<br>
&gt; &gt;<br>
&gt; &gt; Also, I think the names `#:while&#39; and `#:until&#39; are too close to<br>
&gt; &gt; `#:when&#39; and `#:unless&#39;. I suggest `#:break-when&#39; and `#:break-unless&#39;.<br>
&gt; &gt; Compare:<br>
&gt; &gt;<br>
&gt; &gt;  &gt; (for*/list ([j 2] [i 10] #:when (i . &lt; . 5)) i)<br>
&gt; &gt;  &#39;(0 1 2 3 4 0 1 2 3 4)<br>
&gt; &gt;  &gt; (for*/list ([j 2] [i 10] #:break-unless (i . &lt; . 5)) i)<br>
&gt; &gt;  &#39;(0 1 2 3 4)<br>
&gt; &gt;<br>
&gt; &gt; I imagine that `#:break-when&#39; and `#:break-unless&#39; are allowed among<br>
&gt; &gt; the clauses much like `#:when&#39; and `#:unless&#39;, but also allowed at the<br>
&gt; &gt; end of the body. Is that what you had in mind?<br>
&gt;<br>
&gt; Sorry for the bike-shedding, but to me that `#:break-unless&#39; is even<br>
&gt; harder to read than `#:until&#39;.  Possible explanation: &quot;break unless&quot;<br>
&gt; makes me parse two words and figure out how they combine, and &quot;while&quot;<br>
&gt; is something that I know without doing so.<br>
<br>
</div>After trying out various options, I agree that `break-when&#39; is too many<br>
words. I&#39;m currently trying just `break&#39; and dropping `break-unless&#39;,<br>
and that feels better.<br>
<div class="im"><br>
At Fri, 14 Sep 2012 11:49:20 -0400, Carl Eastlund wrote:<br>
&gt; I agree that #:while and #:until are easily confused with #:when and<br>
&gt; #:unless.  I slightly prefer #:stop- to #:break- as a prefix here, it seems<br>
&gt; a more natural word.<br>
<br>
</div>I like &quot;break&quot; because it goes with &quot;for&quot;, it avoids potential<br>
confusion with &quot;stop&quot; in `stop-after&#39; and `stop-before&#39;, and it is more<br>
clearly different from &quot;final&quot; (which is used below).<br>
<br>
&gt; I like the idea of allowing these clauses at the end<br>
<div class="im">&gt; of the body to give a notion of stopping after the current iteration.<br>
<br>
</div>It turns out that allowing `#:break&#39; at the very end of the body causes<br>
problems with scope and composition.<br>
<br>
Imagine trying to implement `for/set&#39; by wrapping its body in an<br>
expansion to `for/fold&#39;. Maybe you can look from the end of the body<br>
and skip back over `#:break&#39; clauses, but now imagine that the last<br>
form before `break&#39; expands to a combination of a definition and an<br>
expression, and the `#:break&#39; clause wants to refer to the identifier<br>
that is bound in the expansion. We could probably make all that work<br>
with `local-expand&#39; and internal-definition contexts, but that gets<br>
complicated.<br>
<br>
Requiring an expression at the end of a `for&#39; body --- while allowing<br>
`#:break&#39; clauses otherwise interspersed in the body --- avoids<br>
composition and scope problems. Macros still have to do a little work<br>
to juggle `#:break&#39; clauses, but a `split-for-body&#39; helper function is<br>
straightforward to use.<br>
<br>
Meanwhile, to support breaking after the current element, I&#39;m trying<br>
out `#:final&#39;. A `#:final&#39; clause is like `#:break&#39;, except that it<br>
ends the loop after the next run of the body. (The two kinds of clauses<br>
closely related to `stop-before&#39; and `stop-after&#39;.)<br>
<br>
&gt; (for/list ([i 10]) #:break (= i 2) i)<br>
&#39;(0 1)<br>
&gt; (for/list ([i 10]) #:final (= i 2) i)<br>
&#39;(0 1 2)<br>
<br>
&gt; (for ([book &#39;(&quot;Guide&quot; &quot;Story&quot; &quot;Reference&quot;)]<br>
        #:break (equal? book &quot;Story&quot;)<br>
        [chapter &#39;(&quot;Intro&quot; &quot;Details&quot; &quot;Conclusion&quot;)])<br>
    (printf &quot;~a ~a\n&quot; book chapter))<br>
Guide Intro<br>
Guide Details<br>
Guide Conclusion<br>
<br>
&gt; (for* ([book &#39;(&quot;Guide&quot; &quot;Story&quot; &quot;Reference&quot;)]<br>
         [chapter &#39;(&quot;Intro&quot; &quot;Details&quot; &quot;Conclusion&quot;)])<br>
    #:break (and (equal? book &quot;Story&quot;)<br>
                 (equal? chapter &quot;Conclusion&quot;))<br>
    (printf &quot;~a ~a\n&quot; book chapter))<br>
Guide Intro<br>
Guide Details<br>
Guide Conclusion<br>
Story Intro<br>
Story Details<br>
<br>
&gt; (for* ([book &#39;(&quot;Guide&quot; &quot;Story&quot; &quot;Reference&quot;)]<br>
         [chapter &#39;(&quot;Intro&quot; &quot;Details&quot; &quot;Conclusion&quot;)])<br>
    #:final (and (equal? book &quot;Story&quot;)<br>
                 (equal? chapter &quot;Conclusion&quot;))<br>
    (printf &quot;~a ~a\n&quot; book chapter))<br>
Guide Intro<br>
Guide Details<br>
Guide Conclusion<br>
Story Intro<br>
Story Details<br>
Story Conclusion<br>
<br>
&gt; (for ([book &#39;(&quot;Guide&quot; &quot;Story&quot; &quot;Reference&quot;)]<br>
        #:final (equal? book &quot;Story&quot;)<br>
        [chapter &#39;(&quot;Intro&quot; &quot;Details&quot; &quot;Conclusion&quot;)])<br>
    (printf &quot;~a ~a\n&quot; book chapter))<br>
Guide Intro<br>
Guide Details<br>
Guide Conclusion<br>
Story Intro<br>
<br>
<br>
</blockquote></div><br>