<br><br>On Wednesday, November 21, 2012, Greg Hendershott  wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Thank you.<br>
<br>
&gt; The lexical information on the outer list structure can<br>
&gt; be different than the lexical information on those objects inside.<br>
<br>
Ah.<br>
<br>
By the way, I&#39;ve read descriptions of syntax objects that list the<br>
accessors, but when it comes to lexical context say &quot;but you don&#39;t<br>
really need that&quot;.<br>
<br></blockquote><div><br></div><div>You definitely need it!</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
But how come there isn&#39;t an accessor named something like<br>
`syntax-lexical-context&#39;?  To explore, visualize, debug?<br>
<br>
(Even if it returned a value that&#39;s just some opaque ID, but unique so<br>
it could be compared to other such values.)<br>
<br></blockquote><div><br></div><div>There is a lot of information there in very specialized representations with lots of subtle complex invariants for efficiency. You don&#39;t want to just print it out. Instead, you can explore it with things like datum-&gt;syntax, passing the syntax object as the first argument and then doing things like free-identifier=?. </div>
<div><br></div><div><div>FWIW, the macro stepper does much of this for you to help you visualize and debug things. </div><div><br></div></div><div>Robby</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

On Wed, Nov 21, 2012 at 9:53 AM, Robby Findler<br>
&lt;<a href="javascript:;" onclick="_e(event, &#39;cvml&#39;, &#39;robby@eecs.northwestern.edu&#39;)">robby@eecs.northwestern.edu</a>&gt; wrote:<br>
&gt; On Wed, Nov 21, 2012 at 8:33 AM, Greg Hendershott<br>
&gt; &lt;<a href="javascript:;" onclick="_e(event, &#39;cvml&#39;, &#39;greghendershott@gmail.com&#39;)">greghendershott@gmail.com</a>&gt; wrote:<br>
&gt;&gt;&gt; The lexical context you&#39;re picking up to put on #&#39;args in the lam<br>
&gt;&gt;&gt; macro is the context that&#39;s sitting on the parentheses in the first<br>
&gt;&gt;&gt; argument to &#39;lam&#39; in the body of &#39;expand-to-lam&#39;. that context has no<br>
&gt;&gt;&gt; &quot;x&quot; bound.<br>
&gt;&gt;<br>
&gt;&gt; OK, that explains why x is not bound. Thanks!<br>
&gt;&gt;<br>
&gt;&gt;&gt; This is the trouble with these kinds of macros: you have to be careful<br>
&gt;&gt;&gt; to propagate the correct lexical information thru. In this case, you<br>
&gt;&gt;&gt; can either change expand-to-lam to carry its argument&#39;s lexical<br>
&gt;&gt;&gt; context onto that open paren there or you can change lam to use a<br>
&gt;&gt;&gt; different spot to get its lexical information (one that&#39;s already<br>
&gt;&gt;&gt; being carried thru, eg the context on the actual variables for<br>
&gt;&gt;&gt; example).<br>
&gt;&gt;<br>
&gt;&gt; I want lam to be usable by other macros without the latter needing to<br>
&gt;&gt; cooperate explicitly; I want them to &quot;just work&quot;. So I prefer the<br>
&gt;&gt; second way.<br>
&gt;<br>
&gt; In general when you are picking and moving around lexical context like<br>
&gt; this then macros won&#39;t &quot;just work&quot;, I&#39;m sorry to say. They will need<br>
&gt; to be aware of which part of the context is being picked up. Best you<br>
&gt; can hope for is &quot;mostly just work&quot;. :)<br>
&gt;<br>
&gt;&gt; But isn&#39;t that what I&#39;m already doing by supplying #&#39;args to datum-&gt;syntax?<br>
&gt;&gt;<br>
&gt;&gt;   (datum-&gt;syntax #&#39;args (append (syntax-&gt;datum #&#39;args)))<br>
&gt;&gt;<br>
&gt;&gt; I don&#39;t see how else to get &quot;the context on the actual variables&quot;. The<br>
&gt;&gt; only other choice seems to be `stx&#39;, which also doesn&#39;t work.<br>
&gt;<br>
&gt; Syntax objects are ordinary datums (a list in this case) paired with<br>
&gt; lexical context information (and other information like src locs, but<br>
&gt; lets ignore that part for now). In this case, if you remove the<br>
&gt; lexical information (using syntax-e, which is a primitive operation<br>
&gt; and one you should build your mental model on) and extract the datum<br>
&gt; inside, you&#39;ll find that it is a list [*] of syntax objects, one for<br>
&gt; each variable. The lexical information on the outer list structure can<br>
&gt; be different than the lexical information on those objects inside.<br>
&gt;<br>
&gt; [*]: sometimes you&#39;ll get a pair where the cdr position is a syntax<br>
&gt; object that wraps another pair (or list) instead of just a list, tho.<br>
&gt;<br>
&gt;&gt;&gt; The model in the JFP paper should shed some light on this, I hope. (I<br>
&gt;&gt;&gt; seem to recall you looking at that before?)<br>
&gt;&gt;<br>
&gt;&gt; I did read it and found it helpful to appreciate what the Racket macro<br>
&gt;&gt; system has to do and how. But I guess I didn&#39;t grok it enough to be<br>
&gt;&gt; able to apply it, here. The lightbulb is flickering but not really on,<br>
&gt;&gt; yet.<br>
&gt;<br>
&gt; The macro you&#39;ve written is actually runnable in the model, I think.<br>
&gt;<br>
&gt; Robby<br>
</blockquote>