<br><div class="gmail_quote">On Fri, Jan 16, 2009 at 3:52 PM, Ryan Culpepper <span dir="ltr">&lt;<a href="mailto:ryanc@ccs.neu.edu">ryanc@ccs.neu.edu</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<br><div class="Ih2E3d"><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
;; the non-working cond-it<br>
(define-syntax (cond-it stx)<br>
 &nbsp;(syntax-case stx (else)<br>
 &nbsp; &nbsp;((cond-it (else exp exp2 ...))<br>
 &nbsp; &nbsp; #&#39;(begin exp exp2 ...))<br>
 &nbsp; &nbsp;((cond-it (test? exp exp2 ...))<br>
 &nbsp; &nbsp; #&#39;(when-it test? exp exp2 ...))<br>
 &nbsp; &nbsp;((cond-it (test? exp exp2 ...) cond1 cond2 ...)<br>
 &nbsp; &nbsp; #&#39;(if-it test? (begin exp exp2 ...)<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;(cond-it cond1 cond2 ...)))))<br>
</blockquote>
<br></div>
When &#39;cond-it&#39; expands and produces an &#39;if-it&#39; expression, the &#39;if-it&#39; is marked by the macro expander as coming from a macro. That means its lexical context is different from the &#39;it&#39; variables in the branches. That means that the &#39;it&#39; variable binding produced by &#39;if-it&#39; does not capture the &#39;it&#39; references in the branches.<br>

</blockquote><div><br>I see - based on this I tried to see if I can mark `if-it` to be the same lexical context but i get a compiler warning instead... <br><br><div style="margin-left: 40px; font-family: courier new,monospace;">
(define-syntax (cond-it stx)<br>&nbsp; (syntax-case stx (else)<br>&nbsp;&nbsp;&nbsp; ((~) #&#39;(void))<br>&nbsp;&nbsp;&nbsp; ((~ (else exp exp2 ...))<br>&nbsp;&nbsp;&nbsp;&nbsp; #&#39;(begin exp exp2 ...))<br>&nbsp;&nbsp;&nbsp; ((~ (test? exp exp2 ...) cond1 ...)<br>&nbsp;&nbsp;&nbsp;&nbsp; (with-syntax ((if-it (datum-&gt;syntax #&#39;~ &#39;if-it)))<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #&#39;(if-it test? (begin exp exp2 ...)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (cond-it cond1 ...))))))<br><br>&gt; (cond-it (#f &#39;hello) (&quot;test me&quot; it) (else &#39;nothing))<br>compile: identifier used out of context in: if-it<br>
</div><br>I guess the app position cannot not be &quot;captured&quot; this way? <br><br></div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">

The macro stepper will show you this using colors. Try an example. The original code is in black. The parts introduced by &#39;cond-it&#39; are in a different color (like red or blue).<div class="Ih2E3d"></div></blockquote>
<div><br>I&#39;m working in emacs so I don&#39;t have macro stepper handy at the moment - is there a way to call macro stepper (a cmdline or repl version) from mzscheme?<br><br></div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
The problem comes from having macros introduce unhygienic bindings of &#39;it&#39;. A better way to do it would be to bind &#39;it&#39; to a syntax parameter and update the meaning of &#39;it&#39; in the expansion of an &#39;if-it&#39; expression (using &#39;syntax-parameterize&#39;). </blockquote>
<div><br>This is macro voodoo! ;)&nbsp; I&#39;ll have to learn more about syntax parameters and transformers.&nbsp; Is there some sort of guide docs that talks about how and why (usages) on these capabilites?<br><br>Thansks for demonstrating the cool technique and the clear explanation.<br>
yc<br><br></div></div>