Hi,<br><br>I didn&#39;t fully read Eli&#39;s very detailed answer, so hopefully I won&#39;t repeat what he said.<br><br>Here, to me it seems the right approach is to keep hygiene, so that you can scope your INDEXes as you want, and so that you know exactly what happens without needing to know the details of `ranged&#39; and `interfere&#39; to know where your indexes are bound:<br>

<br><span style="font-family:courier new,monospace">#lang racket</span><br style="font-family:courier new,monospace"><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">(define-syntax ranged</span><br style="font-family:courier new,monospace">

<span style="font-family:courier new,monospace">  (syntax-rules ()</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">    [(_ [i n] body ...)</span><br style="font-family:courier new,monospace">

<span style="font-family:courier new,monospace">     (for ([i (in-range n)])</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">       body ...)]</span><br style="font-family:courier new,monospace">

<span style="font-family:courier new,monospace">    [(_ n body ...)</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">     (ranged [x n] body ...)]))</span><br style="font-family:courier new,monospace">

<br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">(define-syntax interfere</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">  (syntax-rules ()</span><br style="font-family:courier new,monospace">

<span style="font-family:courier new,monospace">    [(_ (i) body ...)</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">     (ranged [i 1] body ...)]</span><br style="font-family:courier new,monospace">

<span style="font-family:courier new,monospace">    [(_ () body ...)</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">     (ranged 1 body ...)]))</span><br style="font-family:courier new,monospace">

<br style="font-family:courier new,monospace"><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">(ranged 4 </span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">        (interfere (i) (display i)))</span><br style="font-family:courier new,monospace">

<span style="font-family:courier new,monospace">(newline)</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">; -&gt; 0000</span><br style="font-family:courier new,monospace">

<br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">(ranged [i 4]</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">        (interfere () (display i)))</span><br style="font-family:courier new,monospace">

<span style="font-family:courier new,monospace">(newline)</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">; -&gt; 0123</span><br style="font-family:courier new,monospace">


<br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">(ranged [i 4]</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">        (display i)</span><br style="font-family:courier new,monospace">

<span style="font-family:courier new,monospace">        (interfere (i) (display i)))</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">(newline)</span><br style="font-family:courier new,monospace">

<span style="font-family:courier new,monospace">; -&gt; 00102030</span><br><br>Then there is no surprise as to how the program works, and you can nest things as much as you want without worries.<br><br>(If you don&#39;t like the parentheses for (interfere () ...), you can still use syntax-parse and check if the first element is an id.)<br>

<br>Laurent<br><br><br><div class="gmail_quote">On Sun, Apr 29, 2012 at 9:54 PM, Danny Yoo <span dir="ltr">&lt;<a href="mailto:dyoo@cs.wpi.edu" target="_blank">dyoo@cs.wpi.edu</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

Let&#39;s say that I have the following toy iteration form for doing<br>
something over a sequence of numbers:<br>
<br>
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<br>
#lang racket<br>
<br>
(require racket/stxparam)<br>
<br>
(define-syntax (ranged stx)<br>
  (syntax-case stx ()<br>
    [(_ n body ...)<br>
     #&#39;(for ([k n])<br>
         (syntax-parameterize<br>
          ([INDEX (make-rename-transformer #&#39;k)])<br>
          (begin body ...)))]))<br>
<br>
(define-syntax-parameter INDEX<br>
  (lambda (stx)<br>
    (raise-syntax-error #f &quot;Used out of context of a ranged&quot; stx)))<br>
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<br>
<br>
<br>
This provides INDEX as a way to get at the index used at the kth<br>
iteration.  For example:<br>
<br>
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<br>
&gt; (ranged 5 (displayln INDEX))<br>
0<br>
1<br>
2<br>
3<br>
4<br>
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<br>
<br>
<br>
<br>
However, as Brian Mastenbrook notes, the use of syntax parameters here<br>
can be troublesome because they don&#39;t necessarily work lexically.  For<br>
example, we might be devious and do this:<br>
<br>
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<br>
(define-syntax (interfere stx)<br>
  (syntax-case stx ()<br>
    [(_ body ...)<br>
     #&#39;(ranged 1 body ...)]))<br>
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<br>
<br>
The interfere macro here should be a no-op.  However, the use of<br>
&#39;interfere&#39; can interfere with the use of ranged.  As a case in point:<br>
<br>
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<br>
&gt; (ranged 5 (interfere (displayln INDEX)))<br>
0<br>
0<br>
0<br>
0<br>
0<br>
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<br>
<br>
<br>
<br>
and ideally, I would have liked to see this instead:<br>
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<br>
&gt; (ranged 5 (interfere (displayln INDEX)))<br>
0<br>
1<br>
2<br>
3<br>
4<br>
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<br>
<br>
I need to do something extra, since the use of interfere adds an<br>
additional syntax parameterization that breaks the lexicalness I<br>
expected from INDEX.<br>
<br>
<br>
<br>
I can do something that appears to do the trick, but I&#39;m a bit<br>
uncomfortable with it:<br>
<br>
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<br>
#lang racket<br>
<br>
(require racket/stxparam)<br>
<br>
(begin-for-syntax<br>
  (define internal-index-id (gensym &#39;internal-index-id)))<br>
<br>
(define-syntax (ranged stx)<br>
  (syntax-case stx ()<br>
    [(_ n body ...)<br>
     (with-syntax ([k (datum-&gt;syntax stx internal-index-id)])<br>
       (syntax/loc stx<br>
         (for ([k n])<br>
           (begin body ...))))]))<br>
<br>
(define-syntax (INDEX stx)<br>
  (datum-&gt;syntax stx internal-index-id))<br>
<br>
<br>
(define-syntax (interfere stx)<br>
  (syntax-case stx ()<br>
    [(_ body ...)<br>
     (syntax/loc stx<br>
       (ranged 1 body ...))]))<br>
<br>
(ranged 5 (interfere (displayln INDEX)))<br>
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<br>
<br>
The use of the gensym there is what makes me uncomfortable.  I&#39;m not<br>
exactly sure what the right approach is supposed to be here, though.<br>
Suggestions?<br>
<br>
<br>
Thank you!<br>
____________________<br>
  Racket Users list:<br>
  <a href="http://lists.racket-lang.org/users" target="_blank">http://lists.racket-lang.org/users</a><br>
</blockquote></div><br>