<html>
<body>
<font size=3>At 04:49 PM 9/9/2006, Jens Axel Søgaard wrote:<br>
<blockquote type=cite class=cite cite="">Blake McBride skrev:<br><br>
<blockquote type=cite class=cite cite="">If I try:<br>
(define-syntax foo<br>
&nbsp; (lambda (stx)<br>
&nbsp;&nbsp;&nbsp; (datum-&gt;syntax-object stx (car
(syntax-object-&gt;datum stx)))))<br>
(foo 6)<br>
I get:&nbsp; car: expects argument of type &lt;pair&gt;; given foo<br>
So if stx represents the &quot;foo&quot; token, how do you get to the
6?</blockquote><br>
You missed that the transformer is called twice.<br><br>
&nbsp;To expand (foo 6) the transformer is called with the
syntax-object<br>
&nbsp;#'(foo 6).<br>
&nbsp;The (car (syntax-object-&gt;datum stx)) extract the symbol
foo,<br>
&nbsp;and the (datum-&gt;syntax-object stx ...) converts it to an
identifier<br>
&nbsp;that are returned as the result.<br><br>
&nbsp;Now the result is expanded. Now the transformer is called with<br>
&nbsp;the single identifier #'foo. The (syntax-object-&gt;datum stx)<br>
&nbsp;converts it to the symbol 'foo. And now (car 'foo) gives<br>
&nbsp;the error you see.<br><br>
To get the 6 take the cadr instead of the car.<br><br>
(define-syntax foo<br>
&nbsp; (lambda (stx)<br>
&nbsp;&nbsp;&nbsp; (datum-&gt;syntax-object stx<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
(cadr (syntax-object-&gt;datum stx)))))</blockquote><br>
I'm confused.&nbsp; In my example car of (foo 6) returns foo.<br>
Then its called again and I get the error when attempting<br>
a car on foo.<br><br>
You use cadr.&nbsp; Let's follow this through with the same logic.<br>
The first time you are doing a cadr on (foo 6) yielding 6.<br>
But, when it goes through again it should be attempting a<br>
cadr on the 6.&nbsp; That shouldn't work either.<br><br>
I think I am confused about the steps happening.&nbsp; In lisp<br>
macros it too goes through two passes.&nbsp; The first time<br>
the macro code is executed to create an s-expression.<br>
Then the s-expression is evaluated.&nbsp; Something different is<br>
happening with define-syntax.&nbsp; First of all I'm dealing with<br>
a syntax object instead of an s-expression in the first pass<br>
at least.<br><br>
If I do (syntax-object-&gt;datum stx) do I get the s-expression<br>
just like the lisp macro stuff? <br><br>
If so, I should be able to manipulate it any way I like and then<br>
run datum-&gt;syntax-object on it in the end to turn it back into<br>
a syntax object to be evaluated.<br><br>
This is my attempt to understand it but my experiments indicate<br>
that my idea is wrong.<br><br>
Thanks for working with me!<br><br>
Blake McBride<br>
</font></body>
</html>