<div dir="ltr"><div>Nick,<br><br></div>You can&#39;t just go by the immediate expansion.  Lots of temporary names are bound by forms like define-values/invoke-unit; it binds an internal alias called msg-chan-subscribe that should be defined as a rename transformer for diagrammsg-chan-subscribe.  Can you give a full example the rest of us can look at, and perhaps illustrate what incorrect runtime behavior is caused by this problem?  That will be more telling than just the textual name from expansion, because identifiers carry a lot of &quot;invisible&quot; data about their bindings.<br>

</div><div class="gmail_extra"><br clear="all"><div>Carl Eastlund</div>
<br><br><div class="gmail_quote">On Wed, Aug 7, 2013 at 10:00 PM, Nick Main <span dir="ltr">&lt;<a href="mailto:david.nick.main@gmail.com" target="_blank">david.nick.main@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">

<div dir="ltr"><font face="courier new, monospace">I have a signature that includes a macro to clean up the use of one of the procs in the signature.</font><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">Two different units with the same signature are used via define-values/invoke-unit - the second one uses a prefix in the export sig-spec to differentiate it from the first.</font></div>



<div><font face="courier new, monospace">The macro introduced by the second use does not refer to the other proc using the prefix.</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">The concrete example:</font></div>



<div><font face="courier new, monospace"><br></font></div><div><div><font face="courier new, monospace">;; Signature of a message channel</font></div><div><font face="courier new, monospace">(define-signature message-channel^</font></div>



<div><font face="courier new, monospace">  (</font></div><div><font face="courier new, monospace">   ;; ...</font></div><div><font face="courier new, monospace">   msg-chan-subscribe   ; ( (msg -&gt; boolean) first? -&gt; thunk)</font></div>



<div><font face="courier new, monospace">   </font></div><div><font face="courier new, monospace">   ;; Enqueue message(s) for a channel at normal priority </font></div><div><font face="courier new, monospace">   &lt;--   ; ( msg .. -&gt; void )</font></div>



<div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">   ;; Enqueue message(s) for a channel at high priority </font></div><div><font face="courier new, monospace">   &lt;++   ; ( msg .. -&gt; void )</font></div>



<div><font face="courier new, monospace">      </font></div><div><font face="courier new, monospace">   ;; Macro to create a message handler.</font></div><div><font face="courier new, monospace">   ;; ...</font></div><div>



<font face="courier new, monospace">   (define-syntaxes (==&gt;)</font></div><div><font face="courier new, monospace">     (syntax-rules (msg)</font></div><div><font face="courier new, monospace">       [(_ match-body ...) (msg-chan-subscribe </font></div>



<div><font face="courier new, monospace">                            (λ(msg) </font></div><div><font face="courier new, monospace">                              (syntax-parameterize </font></div><div><font face="courier new, monospace">                               ([the-message (make-rename-transformer #&#39;msg)])</font></div>



<div><font face="courier new, monospace">                               (match msg </font></div><div><font face="courier new, monospace">                                 match-body ...</font></div><div><font face="courier new, monospace">                                 [_ #t])))</font></div>



<div><font face="courier new, monospace">                            #f)]))</font><span style="font-family:&#39;courier new&#39;,monospace">))</span></div></div><div><span style="font-family:&#39;courier new&#39;,monospace"><br>



</span></div><div><span style="font-family:&#39;courier new&#39;,monospace"><br></span></div><div><span style="font-family:&#39;courier new&#39;,monospace">When (</span><span style="font-family:&#39;courier new&#39;,monospace">define-values/invoke-unit &lt;some-unit&gt; (import) (export (prefix diagram message-channel^))) is used it introduces the bindings diagram&lt;-- , diagram&lt;++ , diagrammsg-chan-subscribe and diagram==&gt; .</span></div>



<div><span style="font-family:&#39;courier new&#39;,monospace"><br></span></div><div><span style="font-family:&#39;courier new&#39;,monospace">The form</span></div><div><font face="courier new, monospace"><br></font></div>



<div><font face="courier new, monospace">(diagram==&gt;</font></div><div><font face="courier new, monospace">   .. message handlers ..)</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">expands to (msg-chan-subscribe ...) rather than (</font><span style="font-family:&#39;courier new&#39;,monospace">diagrammsg-chan-subscribe ...) - and thus it listens to the first (wrong) message channel.</span></div>



<div><span style="font-family:&#39;courier new&#39;,monospace"><br></span></div><div><span style="font-family:&#39;courier new&#39;,monospace">Is there any way to make macros defined in signatures be aware of the prefix used with the signature ?</span></div>



</div>
<br>____________________<br>
  Racket Users list:<br>
  <a href="http://lists.racket-lang.org/users" target="_blank">http://lists.racket-lang.org/users</a><br>
<br></blockquote></div><br></div>