<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><br><div><div>On Feb 12, 2012, at 2:53 PM, FS Racket wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><div class="im" style=""><blockquote class="gmail_quote" style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<div style="word-wrap:break-word"><div>In the example that doesn't work, the first mult is needed for another use of ==&gt;. In the simpler examples, it is not. Notice that the orphaned mult occurs on the second step when another use is expanded, while in the simpler examples another use of ==&gt; does not occur. &nbsp;In the simple cases, mult is known to the expanded code; in the example that doesn't work, mult is not known to repeated use of the macro. Another clue is: if you run the test in the interactions window, it works because the definition of mult (in definitions) is automatically provided for interactions.</div>
<div><br></div><div>I haven't even read your macro; the amazing and amusing macro stepper knows all and tells all.</div><div><br></div></div></blockquote><div><br></div></div><div style="">Your comment caused me to think about why the repeated calls to ==&gt; would 'mult' to become "unknown". &nbsp;Eventually, I realized that the syntax-&gt;datum call was probably doing too much; i.e. it was stripping away too much information so when I built back up the new expression, the binding of 'mult' was lost. &nbsp;</div>
<div style=""><br></div><div style="">At least, that's my guess. &nbsp;I think the Racket documentation is fantastic but I find a bit of experimentation is necessary to figure some things out and that's what I've come up with. &nbsp;(Perhaps an experience macrologist can comment?). &nbsp;</div>
<div style=""><br></div><div style="">Anyhow, here's a version that works (er...at least it seems to work so far...):</div><div style=""><br></div><div style=""><div class="im" style="color:rgb(80,0,80)"><div>(define-syntax ==&gt;</div>
<div>&nbsp; (lambda (stx)</div><div>&nbsp; &nbsp; (define (replace-in-first exp-list new-val)</div><div>&nbsp; &nbsp; &nbsp; (let* ([new-exp&nbsp;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (map (λ (x)&nbsp;</div></div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;(if (eq? (syntax-e x) '_)</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;new-val</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;x))</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;(syntax-&gt;list (car exp-list))) ]</div></div></blockquote><div><br></div>It's nice to make the macro processor do the work for you. In Matthias Felleisen's example, 'it' is born in the environment of the program, then the macro uses that same 'it' for the 'let' assignment and the arguments in the supplied expressions. Your macro requires more writing because&nbsp;it doesn't take advantage of such scope control and it doesn't&nbsp;use ellipses to form the loop.</div><div><br></div><div>I'm reading the macro chapter in the guide now (totally coincidentally), so I am curious to find out if there is a new way to write syntax-rules for the cases for which they have worked so well in the past.</div><div><br></div><div>rac &nbsp;</div><div><br></div><div><br><blockquote type="cite">
____________________<br> &nbsp;Racket Users list:<br> &nbsp;<a href="http://lists.racket-lang.org/users">http://lists.racket-lang.org/users</a><br></blockquote></div><br></body></html>