<div dir="ltr">Right, that&#39;s the issue with needing the (let () result) in my define-syntax-rule version.  I still didn&#39;t need split-for-body, which doesn&#39;t guarantee there are no definitions in the post ... part.  All it guarantees to eliminate are #:final and #:break.<br>

</div><div class="gmail_extra"><br clear="all"><div>Carl Eastlund</div>
<br><br><div class="gmail_quote">On Fri, Sep 6, 2013 at 12:09 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">

The issue is `begin` splicing. The `result` form could be a `begin`<br>
form that contains definitions that are referenced by a preceding<br>
forms.<br>
<br>
For example, given<br>
<br>
 (define (fish? v) (or (red? v) (blue? v)))<br>
 (begin<br>
  (define (red? v) ....)<br>
  (define (blue? v) ....)<br>
  5)<br>
<br>
With `begin` splicing, that turns into<br>
<br>
 (define (fish? v) (or (red? v) (blue? v)))<br>
 (define (red? v) ....)<br>
 (define (blue? v) ....)<br>
 5<br>
<br>
which is different than<br>
<br>
 (define (fish? v) (or (red? v) (blue? v)))<br>
 (let ()<br>
   (define (red? v) ....)<br>
   (define (blue? v) ....)<br>
   5)<br>
<div><div class="h5"><br>
At Fri, 6 Sep 2013 11:15:50 -0400, Carl Eastlund wrote:<br>
&gt; Is this function ever particularly necessary?  Its intended use seems to be<br>
&gt; like so:<br>
&gt;<br>
&gt; (define-syntax (for/print stx)<br>
&gt;   (syntax-parse stx<br>
&gt;     [(_ clauses . body)<br>
&gt;      (with-syntax ([([pre ...] [post ...]) (split-for-body #&#39;body)])<br>
&gt;        (syntax<br>
&gt;          (for clauses<br>
&gt;            pre ...<br>
&gt;            (printf &quot;~v/n&quot; (let () post ...)))))]))<br>
&gt;<br>
&gt; That way any #:break or #:final from the body ends up in pre ..., where the<br>
&gt; enclosing for loop will interpret them, and post ... will only include<br>
&gt; normal definitions and expressions.<br>
&gt;<br>
&gt; But it seems to me there&#39;s a much easier way that should always work:<br>
&gt;<br>
&gt; (define-syntax-rule (for/print clauses pre ... result)<br>
&gt;   (for clauses<br>
&gt;     pre ...<br>
&gt;     (printf &quot;~v\n&quot; result)))<br>
&gt;<br>
&gt; This not only puts all #:break and #:final clauses in pre ..., it should<br>
&gt; guarantee result is an expression.  Perhaps one should still write (let ()<br>
&gt; result) in case result is (begin defn expr), but that&#39;s still simpler than<br>
&gt; using split-for-body.<br>
&gt;<br>
&gt; My question is -- have I overlooked some clever subtlety here that makes<br>
&gt; split-for-body necessary, or is it usually easier to just decompose pre ...<br>
&gt; result rather than bothering with split-for-body?<br>
&gt;<br>
&gt; Carl Eastlund<br>
</div></div>&gt; _________________________<br>
&gt;   Racket Developers list:<br>
&gt;   <a href="http://lists.racket-lang.org/dev" target="_blank">http://lists.racket-lang.org/dev</a><br>
<br>
</blockquote></div><br></div>