<div dir="ltr">Essentially yes.  It doesn&#39;t do anything else, but it needs an identifier to do it.  Currently, TR starts with a module and a symbol, goes through an expensive process to forge an identifier from them, just to call free-identifier=? to compare based on the module and the symbol after all.  Doing the comparison directly, without ever forging the identifier, would be quicker.<br>

<div><br><div class="gmail_extra">On Thu, May 23, 2013 at 8:43 PM, Eric Dobson <span dir="ltr">&lt;<a href="mailto:eric.n.dobson@gmail.com" target="_blank">eric.n.dobson@gmail.com</a>&gt;</span> wrote:<br><div class="gmail_quote">

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Isn&#39;t that exactly what free-indentifier=? is checking for on<br>
identfiers with a module level binding? Or is there something else it<br>
does?<br>
<div class="HOEnZb"><div class="h5"><br>
On Thu, May 23, 2013 at 3:13 PM, Carl Eastlund &lt;<a href="mailto:cce@ccs.neu.edu">cce@ccs.neu.edu</a>&gt; wrote:<br>
&gt; On Thu, May 23, 2013 at 4:13 PM, Ryan Culpepper &lt;<a href="mailto:ryanc@ccs.neu.edu">ryanc@ccs.neu.edu</a>&gt; wrote:<br>
&gt;&gt;<br>
&gt;&gt; On 05/23/2013 01:57 AM, Eric Dobson wrote:<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; Some modules have macros which expand into identifiers that are not<br>
&gt;&gt;&gt; exported, as they want to protect those bindings. TR currently has the<br>
&gt;&gt;&gt; following code which allows it to generate an identifier which is<br>
&gt;&gt;&gt; free-identifier=? to what would appear in the output of the macros.<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; define (make-template-identifier what where)<br>
&gt;&gt;&gt;    (let ([name (module-path-index-resolve (module-path-index-join where<br>
&gt;&gt;&gt; #f))])<br>
&gt;&gt;&gt;      (parameterize ([current-namespace (make-empty-namespace)])<br>
&gt;&gt;&gt;        (namespace-attach-module (current-namespace) &#39;&#39;#%kernel)<br>
&gt;&gt;&gt;        (parameterize ([current-module-declare-name name])<br>
&gt;&gt;&gt;          (eval `(,#&#39;module any &#39;#%kernel<br>
&gt;&gt;&gt;                   (#%provide ,what)<br>
&gt;&gt;&gt;                   (define-values (,what) #f))))<br>
&gt;&gt;&gt;        (namespace-require `(for-template ,name))<br>
&gt;&gt;&gt;        (namespace-syntax-introduce (datum-&gt;syntax #f what)))))<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; This turns out to be a slightly slow part of the initialization of TR.<br>
&gt;&gt;&gt; Does anyone know another way to get such an identifier?<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; There&#39;s another way around this issue, which is to avoid creating these<br>
&gt;&gt; identifiers at all. In other words, change the representation of the type<br>
&gt;&gt; environment to something that supports symbol+module pairs as keys in<br>
&gt;&gt; addition to identifiers. The easiest way to do that is to add in a hash<br>
&gt;&gt; table behind the current free-id-table, since the two tables would handle<br>
&gt;&gt; disjoint sets of identifiers.<br>
&gt;&gt;<br>
&gt;&gt; Ryan<br>
&gt;<br>
&gt;<br>
&gt; I would not have thought that&#39;d work, but apparently identifier-binding will<br>
&gt; give one that information.  Nice going, Ryan!<br>
&gt;<br>
&gt; --Carl<br>
<br>
</div></div></blockquote></div><br></div></div></div>