<HTML><FONT FACE=arial,helvetica><FONT  SIZE=2 FAMILY="SANSSERIF" FACE="Arial" LANG="0">In a message dated 5/23/2003 10:13:07 PM Central Daylight Time, mcj4@ukc.ac.uk writes:<BR>
<BR>
<BLOCKQUOTE TYPE=CITE style="BORDER-LEFT: #0000ff 2px solid; MARGIN-LEFT: 5px; MARGIN-RIGHT: 0px; PADDING-LEFT: 5px">I get a complaint about #%app not being bound, in particular with respect to my calls to <BR>
'vector-ref'. I've read the docs on this a few times; I don't think it's unclear, but I do think I <BR>
don't understand.</BLOCKQUOTE><BR>
<BR>
This error message should be really read as "macro messed with the hygiene;<BR>
the module system detects that the author got the hygiene marks wrong" ;)<BR>
<BR>
I actually get a different error message when I use your code and example:<BR>
&gt; (let ((v (vector 1 2 3))<BR>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (v2 (vector 4 5))<BR>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (v3 (vector 6)))<BR>
&gt;&nbsp;&nbsp;&nbsp;&nbsp; (bind ((v a b c) (v2 d e) (v3 f))<BR>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (list v.a v.b v.c v2.d v2.e v3.f)))<BR>
gives me an error that v is not bound, which is really the same problem<BR>
(that is, the syntax "marks" on v in the macro result are somehow not <BR>
the same as those for the v bound in my own let binding).<BR>
<BR>
I think part of the problem is that you throw away all syntax info very<BR>
early on, with the call to syntax-object-&gt;datum. Then, in building up the<BR>
let bindings, it is unclear actually what syntax information will be associated<BR>
with both the vector binding names (v, v2, and v3) and vector-ref. To be safer<BR>
only the v.a, v.b, etc. should be "washed" through datum-&gt;syntax-object.<BR>
<BR>
The following code works, producing "(1 2 3 4 5 6)" for the above example.<BR>
Note that I produce the list of let bindings as a list of syntax, rather than lists.<BR>
<BR>
#cs<BR>
(module bind mzscheme<BR>
&nbsp; <BR>
&nbsp; (provide bind)<BR>
&nbsp; <BR>
&nbsp; (define-syntax (bind e)<BR>
&nbsp;&nbsp;&nbsp; (define (process-binding vnm flst)<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (let loop ((pos 0)<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (flst flst))<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (if (null? flst)<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '()<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (cons <BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #`(#,(datum-&gt;syntax-object <BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (string-&gt;symbol <BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (string-append (symbol-&gt;string (syntax-object-&gt;datum vnm))<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "."<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (symbol-&gt;string (syntax-object-&gt;datum (car flst))))))<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (vector-ref #,vnm #,pos))<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (loop (+ pos 1) (cdr flst))))))<BR>
&nbsp;&nbsp;&nbsp; (define (make-bindings v-names flst-lists)<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (apply append<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (map process-binding v-names flst-lists)))<BR>
&nbsp;&nbsp;&nbsp; (syntax-case e ()<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ((_ ((v* f ...) ...) code ...)<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #`(let #,(make-bindings (syntax-&gt;list #'(v* ...))<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (map syntax-&gt;list (syntax-&gt;list #'((f ...) ...))))<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; code ...)))))<BR>
<BR>
Jim<BR>
</FONT></HTML>