Ok, now I am confused, which is not a surprise, really.<br><br>As far as I understand this - the problem is that when specifying<br>yield in the original gets &#39;renamed&#39; if the macro is used in other<br>macros due to hygiene rules. 
<br><br>Ryan&#39;s suggestion is to use syntax-parameter, which is a annotation <br>living in the syntax environment only, so it is not altered<br>by the hygiene rules. What is the utility of a syntax-parameter?<br>A syntax variable?
<br><br>Matthias&#39;s solution is to augment the body0 syntax-object with the yield binding<br>not the name. Since name might be a used in other contexts, so the resulting yield<br>is identified to be used in the precisely right context. Hygiene rules won&#39;t do 
<br>the wrong renames/tagging.<br><br>So you could define a kind of a rule of thumb - use the inner most possible <br>scope to introduce new identifiers.<br><br>Cheers,<br>Vlado<br><br><div><span class="gmail_quote">On 8/4/07, 
<b class="gmail_sendername">Matthias Felleisen</b> &lt;<a href="mailto:matthias@ccs.neu.edu">matthias@ccs.neu.edu</a>&gt; wrote:</span><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Vlado, you can, however, choose a different piece of context syntax<br>for the introduction of the yield binding, namely, one from the<br>scope you really want:<br><br>&nbsp;&nbsp;(define-syntax (define/y stx)<br>&nbsp;&nbsp; (syntax-case stx ()
<br>&nbsp;&nbsp;&nbsp;&nbsp; [(_ (name arg ...) body0 body ...)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(with-syntax ((yield-name (datum-&gt;syntax-object #;stx (syntax<br>body0) &#39;yield)))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(syntax<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (define (name arg ...)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (define (yield-name x)
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (control resume-here<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(set! name<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(lambda ()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(prompt (resume-here &#39;dummy))))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (prompt body0 body ...))))]))
<br><br>If you now target this mini-language with a macro, the non-hygienic<br>binding is introduced properly, e.g.,<br><br>&nbsp;&nbsp; (define-syntax foo<br>&nbsp;&nbsp;&nbsp;&nbsp; (syntax-rules ()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((_ (name arg ...) body ...) (define/y (name arg ...) body ...))))
<br><br>&nbsp;&nbsp; (foo (bar) (printf &quot;hello world\n&quot;) (yield 1) (yield 2) &#39;finished)<br><br>&nbsp;&nbsp; (list (bar) (bar) (bar) (bar))<br><br>-- Matthias<br><br><br><br><br><br><br>On Aug 4, 2007, at 10:58 AM, Ryan Culpepper wrote:
<br><br>&gt; On Fri, 2007-08-03 at 13:35 +0100, Vladimir Zlatanov wrote:<br>&gt;&gt;<br>&gt;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2. How can I use the macro system to eliminate the<br>&gt;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#39;yield-name&#39; part<br>&gt;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; of the macro?
<br>&gt;&gt;<br>&gt;&gt; One solution that works, but I do have a few problems with it.<br>&gt;&gt; I had to break the hygiene, which in this case might not be that bad,<br>&gt;&gt; but it is not nice. More worringly for me, I&#39;m not sure why does it
<br>&gt;&gt; really work the way it works. It is a problem with my<br>&gt;&gt; understanding of<br>&gt;&gt; macros, but that might pass with time =)<br>&gt;&gt;<br>&gt;&gt; What would be a hygienic solution?<br>&gt;<br>&gt; One problem with using &#39;datum-&gt;syntax-object&#39; to introduce identifiers
<br>&gt; (breaking hygiene) is that it often breaks down when you write another<br>&gt; macro that expands into the first one.<br>&gt;<br>&gt; For example, here&#39;s a trivial macro:<br>&gt;<br>&gt; (define-syntax define-gen
<br>&gt;&nbsp;&nbsp; (syntax-rules ()<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; [(define-gen (name . args) . body)<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(make-gen (name . args) . body)]))<br>&gt;<br>&gt; Then use it:<br>&gt;<br>&gt; (define-gen (make-step)<br>&gt;&nbsp;&nbsp; (yield 1)<br>&gt;&nbsp;&nbsp; (yield 2)
<br>&gt;&nbsp;&nbsp; (yield 3)<br>&gt;&nbsp;&nbsp; &#39;finished)<br>&gt; (define step (make-step))<br>&gt; (step) ;;&nbsp;&nbsp;produces error: undefined identifier &#39;yield&#39;<br>&gt;<br>&gt; Why? The &#39;make-gen&#39; identifier produced by &#39;define-gen&#39; had a mark on
<br>&gt; it, so the introduced &#39;yield&#39; identifier had a mark on it, so it<br>&gt; didn&#39;t<br>&gt; bind the original, unmarked occurrences of &#39;yield&#39;.<br>&gt;<br>&gt; One nice way to solve this problem is to use syntax parameters. There
<br>&gt; was a thread on this list about them about a year ago, and I wrote<br>&gt; up a<br>&gt; summary here:<br>&gt;<br>&gt; <a href="http://macrologist.blogspot.com/2006/04/macros-parameters-binding-">http://macrologist.blogspot.com/2006/04/macros-parameters-binding-
</a><br>&gt; and.html<br>&gt;<br>&gt; There&#39;s more information in the Help Desk: search for<br>&gt; &#39;syntax-parameterize&#39;.<br>&gt;<br>&gt; Ryan<br>&gt;<br>&gt;<br>&gt;&gt;<br>&gt;&gt; ===========================
<br>&gt;&gt; (require (lib &quot;control.ss&quot;))<br>&gt;&gt;<br>&gt;&gt; (define-syntax (make-gen stx)<br>&gt;&gt;&nbsp;&nbsp; (syntax-case stx ()<br>&gt;&gt;&nbsp;&nbsp;&nbsp;&nbsp; [(mkg (name arg ...) body ...)<br>&gt;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(syntax-case (datum-&gt;syntax-object (syntax mkg) &#39;yield) ()
<br>&gt;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[yield (syntax<br>&gt;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(define (name arg ...)<br>&gt;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(define (control-state) body ...)<br>&gt;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(define (yield value) (control resume-here (set!
<br>&gt;&gt; control-state resume-here) value))<br>&gt;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(lambda () (prompt (control-state)))))])]))<br>&gt;&gt;<br>&gt;&gt; (make-gen (make-step)<br>&gt;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (yield 1)<br>&gt;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (yield 2)
<br>&gt;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (yield 3)<br>&gt;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#39;finished)<br>&gt;&gt;<br>&gt;&gt; (define step (make-step))<br>&gt;&gt;<br>&gt;&gt; (step)(step)(step)(step)(step)<br>&gt;&gt;<br>&gt;&gt; ===========================
<br>&gt;&gt;<br>&gt;&gt; _________________________________________________<br>&gt;&gt;&nbsp;&nbsp; For list-related administrative tasks:<br>&gt;&gt;&nbsp;&nbsp; <a href="http://list.cs.brown.edu/mailman/listinfo/plt-scheme">http://list.cs.brown.edu/mailman/listinfo/plt-scheme
</a><br>&gt;<br>&gt; _________________________________________________<br>&gt;&nbsp;&nbsp; For list-related administrative tasks:<br>&gt;&nbsp;&nbsp; <a href="http://list.cs.brown.edu/mailman/listinfo/plt-scheme">http://list.cs.brown.edu/mailman/listinfo/plt-scheme
</a><br><br></blockquote></div><br>