<div dir="ltr"><div><div><div>I think it isn&#39;t really predictable and you should always just use syntax-&gt;list.<br><br>But in the first case, when you write a pattern like<br><br></div>  (x y ...)<br><br></div>and you have an earlier syntax binding like you do, then the pattern matching macros see this as a &#39;cons&#39;-like operation on syntax and so you get a pair of syntax objects.<br>
<br></div>Exploring the source locations of the intermediate &quot;cons&quot;es inside can also help shed light on what&#39;s happening any particular example, too.<br><br>Robby<br><div><br></div></div><div class="gmail_extra">
<br><br><div class="gmail_quote">On Mon, May 27, 2013 at 2:52 PM, Tim Nelson <span dir="ltr">&lt;<a href="mailto:tbnelson@gmail.com" target="_blank">tbnelson@gmail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Thanks for the quick reply, and the helpful example!<br>
<br>
Can you say a bit more about the circumstances under which syntax-e<br>
will return a pair, even if its datum is a list? That&#39;s the biggest<br>
cause of confusion for me.<br>
<br>
For my purposes, I may just end up switching to syntax-&gt;list in my<br>
program, since that will always return a list.<br>
<div class="HOEnZb"><div class="h5"><br>
On Mon, May 27, 2013 at 3:27 PM, Jay McCarthy &lt;<a href="mailto:jay.mccarthy@gmail.com">jay.mccarthy@gmail.com</a>&gt; wrote:<br>
&gt; A syntax object contains a lot of information in addition to the datum<br>
&gt; inside it. Sometimes that datum will be a pair or a list. And<br>
&gt; sometimes the extra data needs to be associated with just the pair and<br>
&gt; sometimes with all the elements of the list.<br>
&gt;<br>
&gt; If you look at this program:<br>
&gt;<br>
&gt; #lang racket/base<br>
&gt; (require (for-syntax racket/base<br>
&gt;                      racket/match))<br>
&gt; (begin-for-syntax<br>
&gt;   (define show-syntax<br>
&gt;     (match-lambda<br>
&gt;      [(? syntax? s)<br>
&gt;       (printf &quot;syntax from line ~a\n&quot;<br>
&gt;               (syntax-line s))<br>
&gt;       (show-syntax (syntax-e s))]<br>
&gt;      [(? list? l)<br>
&gt;       (printf &quot;list\n&quot;)<br>
&gt;       (for-each show-syntax l)]<br>
&gt;      [(? pair? p)<br>
&gt;       (printf &quot;pair\n&quot;)<br>
&gt;       (show-syntax (car p))<br>
&gt;       (show-syntax (cdr p))]<br>
&gt;      [(? symbol? s)<br>
&gt;       (printf &quot;symbol ~a\n&quot; s)])))<br>
&gt;<br>
&gt; (define-syntax (ex stx)<br>
&gt;   (show-syntax stx)<br>
&gt;   #&#39;(void))<br>
&gt;<br>
&gt; (define-syntax (helper1 stx)<br>
&gt;   #`(ex #,stx))<br>
&gt;<br>
&gt; (define-syntax (helper2 stx)<br>
&gt;   (syntax-case stx ()<br>
&gt;     [(_ a ...)<br>
&gt;      (syntax<br>
&gt;        (ex a ...))]))<br>
&gt;<br>
&gt; (define-syntax (helper3 stx)<br>
&gt;   (syntax-case stx ()<br>
&gt;     [(_ a ...)<br>
&gt;      (syntax<br>
&gt;        (ex a ... z))]))<br>
&gt;<br>
&gt; (module+ main<br>
&gt;   (ex x)<br>
&gt;   ex<br>
&gt;   (helper1 a b c)<br>
&gt;   (helper1 . (a b c))<br>
&gt;   (helper2 a b c)<br>
&gt;   (helper3 a b c))<br>
&gt;<br>
&gt; You can see how each of the different &quot;helpers&quot; appear to do things<br>
&gt; that are very close to one another but turn out to have different<br>
&gt; syntax representations.<br>
&gt;<br>
&gt; You normally don&#39;t need to worry about this, but sometimes you need to<br>
&gt; pay attention to it when you want to get correct source code<br>
&gt; origination information. (Basically, if you have a list in the pattern<br>
&gt; input and do something like creating a new syntax object like #&#39;(a<br>
&gt; ...) in a macro and then put that in, then you&#39;ll get source code<br>
&gt; location information from the macro and not from the source of the<br>
&gt; list, which sometimes gets exposed.)<br>
&gt;<br>
&gt; Jay<br>
&gt;<br>
&gt;<br>
&gt; On Mon, May 27, 2013 at 1:06 PM, Tim Nelson &lt;<a href="mailto:tbnelson@gmail.com">tbnelson@gmail.com</a>&gt; wrote:<br>
&gt;&gt; Dear All,<br>
&gt;&gt;<br>
&gt;&gt; The documentation for syntax-e says that it may return many different<br>
&gt;&gt; types, including a syntax-pair, but it doesn&#39;t really describe why. Here&#39;s<br>
&gt;&gt; a concrete piece of code:<br>
&gt;&gt;<br>
&gt;&gt; (define stx<br>
&gt;&gt;   (with-syntax ([x #&#39;5]<br>
&gt;&gt;                 [(y ...) #&#39;(1 2)])<br>
&gt;&gt;     (syntax (x y ...))))<br>
&gt;&gt;<br>
&gt;&gt; (syntax-&gt;datum stx) returns a list.<br>
&gt;&gt;<br>
&gt;&gt; (syntax-&gt;list stx) (of course) returns a list, too.<br>
&gt;&gt;<br>
&gt;&gt; But (syntax-e stx) returns a pair! If I do this:<br>
&gt;&gt;<br>
&gt;&gt; (define stx2<br>
&gt;&gt;   (with-syntax ([x #&#39;5]<br>
&gt;&gt;                 [y #&#39;(1 2)])<br>
&gt;&gt;     (syntax (x y))))<br>
&gt;&gt;<br>
&gt;&gt; I get a list from syntax-e, but of course the nesting is wrong/different.<br>
&gt;&gt;<br>
&gt;&gt; So my question is: why a pair?<br>
&gt;&gt;<br>
&gt;&gt; Best,<br>
&gt;&gt; - Tim (Running Racket v. 5.3.3)<br>
&gt;&gt; ____________________<br>
&gt;&gt;   Racket Users list:<br>
&gt;&gt;   <a href="http://lists.racket-lang.org/users" target="_blank">http://lists.racket-lang.org/users</a><br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt; --<br>
&gt; Jay McCarthy &lt;<a href="mailto:jay@cs.byu.edu">jay@cs.byu.edu</a>&gt;<br>
&gt; Assistant Professor / Brigham Young University<br>
&gt; <a href="http://faculty.cs.byu.edu/~jay" target="_blank">http://faculty.cs.byu.edu/~jay</a><br>
&gt;<br>
&gt; &quot;The glory of God is Intelligence&quot; - D&amp;C 93<br>
____________________<br>
  Racket Users list:<br>
  <a href="http://lists.racket-lang.org/users" target="_blank">http://lists.racket-lang.org/users</a><br>
</div></div></blockquote></div><br></div>