<div dir="ltr"><div><div><div><div>Scott,<br><br></div>What you're doing isn't possible -- isn't even meaningful -- in general.  You want to expand (MACRO-NAME (pred-a? z) (pred-b? z)) into (MACRO-NAME (equal? z "hey") (equal? z "there")) for some arbitrary MACRO-NAME you haven't listed.  That's not at all safe!  For instance, you did it with the name or.  Well, what if we were in this context...<br>

<br></div>(define-syntax-rule (or e ...) (quote (e ...)))<br><br></div>Now you're not rewriting equals to equals with respect to the definitions of pred-a? and pred-b?, you're changing the value of a quoted constant by rewriting the arguments to or.  Unless you know the macros whose arguments you're expanding, you don't know which positions in their arguments represent expressions.  Some positions might be expressions, some might be binding names, some might be quoted data, some might be other things like match patterns that have a wholly different meaning.<br>

<br></div>There's a reason local-expand is as limited as it is.  Macro expansion is very hard to do inside anything except a fully expanded context.  Usually when we want to control expansion somewhere else, we either local expand all the way down, or we delay the effect somehow.  For instance, you might wrap the expression with let-syntax to rebind the names pred-a? and pred-b?, shadowing them with macros that do the substitution you want when expansion naturally reaches them.<br>

</div><div class="gmail_extra"><br clear="all"><div>Carl Eastlund</div>
<br><br><div class="gmail_quote">On Thu, Jan 23, 2014 at 8:06 PM, Scott Klarenbach <span dir="ltr"><<a href="mailto:scott@pointyhat.ca" target="_blank">scott@pointyhat.ca</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

<div dir="ltr">I'm trying use local-expand <div><br></div><div>(<a href="http://docs.racket-lang.org/reference/stxtrans.html?q=local-expand&q=local-expand#%28def._%28%28quote._~23~25kernel%29._local-expand%29%29" target="_blank">http://docs.racket-lang.org/reference/stxtrans.html?q=local-expand&q=local-expand#%28def._%28%28quote._~23~25kernel%29._local-expand%29%29</a>)</div>


<div><br><div>to partially expand sub-expressions.  The only expressions I want to expand are known in advance, I'm just having trouble coming up with an elegant recursive algorithm for doing this.<div><br></div><div>


For example:</div><div><br></div><div>(define (pred-a? x) (equal? x "hey"))</div><div>(define (pred-b? y) (equal? y "there"))</div><div>(define other-expr (lambda (z) (or (equal? z "you") (pred-a? z) (pred-b? z)))</div>


<div><br></div><div>I'd like to expand other-expr like so that:</div><div><br></div><div>(expand other-expr) >> (lambda (z) (or (equal? z "you") (equal? z "hey") (equal? z "there"))</div>


<div><br></div><div>local-expand sort of works, but provides either too little expansion (#f stop-ids) whereby only the outer macro is expanded, or else it provides too much expansion (list of stop-ids), whereby "and" and "or" etc is expanded into let-values bindings.</div>


<div><br></div><div>What I'd like is something in between.  Rather than a "stop-list", I want an "include-list".  I don't want or / and to expand to let-values, but I do want any of my special nested expressions (that might be 3 levels deep in an or clause) to expand inside the original or.<br>


</div><div><br></div><div>I figure this is not possible using the built-in functions, and so set out trying to build a recursive function that would reconstruct the expression and selectively expand the inner procedures I wish by applying local-expand to the nested operands.</div>


<div><br></div><div>My question is: </div><div><br></div><div>1.) Is there a simple library way to do this with local-expand that I'm missing?</div><div>2.) Does anyone have a hint or code example to do this manually using recursion?  It should be simple enough but I'm embarrassed to admit how long I've wrestled with it.</div>


<div><br></div><div>Thanks.</div><div><br></div><div>-- <br>Talk to you soon,<br><br>Scott Klarenbach<br><br>PointyHat Software Corp.<br><a href="http://www.pointyhat.ca" target="_blank">www.pointyhat.ca</a><br>p <a href="tel:604-568-4280" value="+16045684280" target="_blank">604-568-4280</a><br>


e <a href="mailto:scott@pointyhat.ca" target="_blank">scott@pointyhat.ca</a><br><span style="color:rgb(34,34,34);font-size:13px;font-family:arial,sans-serif">200-1575 W. Georgia</span><br>
Vancouver, BC <span style="color:rgb(34,34,34);font-size:13px;font-family:arial,sans-serif">V6G2V3</span><br><br>_______________________________________<br>To iterate is human; to recur, divine
</div></div></div></div>
<br>____________________<br>
  Racket Users list:<br>
  <a href="http://lists.racket-lang.org/users" target="_blank">http://lists.racket-lang.org/users</a><br>
<br></blockquote></div><br></div>