<html>
<body>
<font size=3>At 02:09 PM 9/9/2006, Eli Barzilay wrote:<br>
<blockquote type=cite class=cite cite="">On Sep&nbsp; 9, Blake McBride
wrote:<br>
&gt; <br>
&gt; I probably mean something like procedural macros that allow you
to<br>
&gt; specify exactly what you want without trying to do it in some
higher<br>
&gt; level 4th generational descriptive pattern language.&nbsp; I
believe<br>
&gt; there is an SRFI about this.<br><br>
Well then, `define-syntax' does just that.&nbsp; When you write:<br><br>
&nbsp; (define-syntax foo<br>
&nbsp;&nbsp;&nbsp; (lambda (stx)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...))<br><br>
you bind `foo' -- as a syntax -- to a syntax-&gt;syntax transformer<br>
procedure.&nbsp; How you implement the procedure is up to you --<br>
`syntax-rules' can construct simple transformers very easily, and<br>
`syntax-case' gives you only the pattern matching part in an easy<br>
way.&nbsp; But nothing prevents you to write your own body in the
above<br>
definition, and you can use the basic syntax manipulation tools<br>
(syntax-e, syntax-object-&gt;datum and
datum-&gt;syntax-object).</blockquote><br>
This is very interesting to me.&nbsp; If I could deal with syntax
objects<br>
the way I want and go back and forth between syntax objects<br>
and scheme objects I would be able to do anything I wanted.<br>
Once I get a good understanding of all this I could better
understand<br>
what the heck is going on with syntax-case.<br><br>
I'd like to play with this.&nbsp; I did try for a few minutes and
couldn't get<br>
anywhere.&nbsp; For starters, on entry stx, I presume, is a syntax
object<br>
representing my call.&nbsp; I presume the lambda must also return a
syntax object.<br>
Since stx is already a syntax object I tried:<br><br>
(define-syntax foo<br>
&nbsp; (lambda (stx)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; stx))<br><br>
(foo 6)<br><br>
and the system hangs.<br><br>
If I try:<br><br>
<br>
(define-syntax foo<br>
&nbsp; (lambda (stx)<br>
&nbsp;&nbsp;&nbsp; (syntax-object-&gt;datum stx)))<br><br>
(foo 6)<br><br>
I get:&nbsp; foo: return value from syntax expander was not syntax: (foo
6)<br><br>
If I try:<br><br>
<br>
(define-syntax foo<br>
&nbsp; (lambda (stx)<br>
&nbsp;&nbsp;&nbsp; (datum-&gt;syntax-object stx (car
(syntax-object-&gt;datum stx)))))<br><br>
(foo 6)<br><br>
I get:&nbsp; car: expects argument of type &lt;pair&gt;; given
foo<br><br>
So if stx represents the &quot;foo&quot; token, how do you get to the
6?<br><br>
Of course if I try:<br><br>
<br>
(define-syntax foo<br>
&nbsp; (lambda (stx)<br>
&nbsp;&nbsp;&nbsp; (datum-&gt;syntax-object stx (syntax-object-&gt;datum
stx))))<br><br>
(foo 6)<br><br>
I get the system hang again (I'm now full loop).<br><br>
I really like your suggestion.&nbsp; I just can't figure our how to get
it to work at all.<br>
(I'd prefer to avoid syntax-e since it doesn't seem to be
standard.)<br><br>
Any examples to help me grok this would be greatly appreciated.<br><br>
Blake McBride<br><br>
<br>
</font></body>
</html>