<div dir="ltr">Thanks, I&#39;ll look into that.  It&#39;s implemented in the C code, but it looks like it&#39;s effectively doing a combination of generate-temporary and syntax-local-lift-module-end-declaration.  I don&#39;t think it gives me the option of creating two fresh identifiers with the same printed name in the same module and have them be immediately unique via free-identifier=?, as the binding would not have taken effect yet, so to speak.  This is one of those cases where my life would be so much easier if I could relax any one of the constraints I&#39;m working under.<br>

</div><div class="gmail_extra"><br clear="all"><div>Carl Eastlund</div>
<br><br><div class="gmail_quote">On Fri, May 31, 2013 at 9:58 AM, 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><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

If you replace all of your internal definition manipulation with<br>
(syntax-local-lift-expression #&#39;#f), it passes your check.rkt. You<br>
don&#39;t have control over the names, but I&#39;m guessing you could look<br>
into the implementation and see what it is doing to generate such<br>
names.<br>
<div class="HOEnZb"><div class="h5"><br>
On Fri, May 31, 2013 at 8:32 AM, Carl Eastlund &lt;<a href="mailto:cce@ccs.neu.edu">cce@ccs.neu.edu</a>&gt; wrote:<br>
&gt; I want a non-probabilistic guarantee of uniqueness, partly because I&#39;d<br>
&gt; rather not rely on something nondeterministic, and partly because in an<br>
&gt; ideal solution, I&#39;d like to have control over the printed names of these<br>
&gt; identifiers.<br>
&gt;<br>
&gt; Carl Eastlund<br>
&gt;<br>
&gt; On Fri, May 31, 2013 at 9:27 AM, Eric Dobson &lt;<a href="mailto:eric.n.dobson@gmail.com">eric.n.dobson@gmail.com</a>&gt;<br>
&gt; wrote:<br>
&gt;&gt;<br>
&gt;&gt; What does unique mean in this context? Does probabilistically unique<br>
&gt;&gt; work? If so could you form an identifier with the symbolic form<br>
&gt;&gt; &quot;unique-id-&quot;+UUID?<br>
&gt;&gt;<br>
&gt;&gt; On Fri, May 31, 2013 at 8:20 AM, Carl Eastlund &lt;<a href="mailto:cce@ccs.neu.edu">cce@ccs.neu.edu</a>&gt; wrote:<br>
&gt;&gt; &gt; I&#39;m having trouble creating identifiers that are unique with respect to<br>
&gt;&gt; &gt; free-identifier=? and that survive marshaling to compiled code.  The<br>
&gt;&gt; &gt; normal<br>
&gt;&gt; &gt; source of fresh identifiers, generate-temporaries, only guarantees they<br>
&gt;&gt; &gt; are<br>
&gt;&gt; &gt; unique with respect to bound-identifier=?.  The obvious alternative,<br>
&gt;&gt; &gt; gensym,<br>
&gt;&gt; &gt; does not properly survive marshaling -- copies saved in different .zo<br>
&gt;&gt; &gt; files<br>
&gt;&gt; &gt; load as distinct identifiers.  I&#39;ve tried a few alternative methods,<br>
&gt;&gt; &gt; none<br>
&gt;&gt; &gt; more successful than either of these.<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; Below, there are a few short files that show the difficulties and can be<br>
&gt;&gt; &gt; used to test other methods.  The first, fresh.rkt, contains the<br>
&gt;&gt; &gt; procedure<br>
&gt;&gt; &gt; used to create fresh identifiers.  The file original.rkt creates a fresh<br>
&gt;&gt; &gt; identifier at compile time.  The file identical.rkt copies the<br>
&gt;&gt; &gt; identifier<br>
&gt;&gt; &gt; from original.rkt using quote-syntax.  The file different.rkt creates<br>
&gt;&gt; &gt; another fresh identifier at compile time.  The file check.rkt checks<br>
&gt;&gt; &gt; that<br>
&gt;&gt; &gt; the identifiers from original.rkt and identical.rkt are<br>
&gt;&gt; &gt; free-identifier=? to<br>
&gt;&gt; &gt; each other, and that the identifiers from original.rkt and different.rkt<br>
&gt;&gt; &gt; are<br>
&gt;&gt; &gt; not free-identifier=? to each other.  To run a test, first update<br>
&gt;&gt; &gt; fresh.rkt<br>
&gt;&gt; &gt; to use the appropriate method for creating identifiers, then run &quot;raco<br>
&gt;&gt; &gt; make<br>
&gt;&gt; &gt; check.rkt&quot;.  Some of the methods work when simply running &quot;racket<br>
&gt;&gt; &gt; check.rkt&quot;, but &quot;raco make&quot; marshals the identifiers to .zo files and<br>
&gt;&gt; &gt; exposes more problems.<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; Can anyone suggest an implementation that would work here?<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; ;;;;; fresh.rkt<br>
&gt;&gt; &gt; #lang racket<br>
&gt;&gt; &gt; (begin-for-syntax<br>
&gt;&gt; &gt;   (require racket/syntax)<br>
&gt;&gt; &gt;   (define (fresh)<br>
&gt;&gt; &gt;     ;; does not guarantee free-identifier=?<br>
&gt;&gt; &gt;     #;(generate-temporary)<br>
&gt;&gt; &gt;     ;; does not survive marshaling<br>
&gt;&gt; &gt;     #;(gensym)<br>
&gt;&gt; &gt;     ;; also does not survive marshaling<br>
&gt;&gt; &gt;     (begin<br>
&gt;&gt; &gt;       (define id0 (datum-&gt;syntax #false &#39;fresh))<br>
&gt;&gt; &gt;       (define ctx (syntax-local-make-definition-context))<br>
&gt;&gt; &gt;       (syntax-local-bind-syntaxes (list id0) #false ctx)<br>
&gt;&gt; &gt;       (internal-definition-context-seal ctx)<br>
&gt;&gt; &gt;       (internal-definition-context-apply ctx id0)))<br>
&gt;&gt; &gt;   (provide fresh))<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; ;;;;; original.rkt<br>
&gt;&gt; &gt; #lang racket<br>
&gt;&gt; &gt; (require &quot;fresh.rkt&quot;)<br>
&gt;&gt; &gt; (define-syntax (macro stx)<br>
&gt;&gt; &gt;   (with-syntax {[name (fresh)]}<br>
&gt;&gt; &gt;     #&#39;(begin-for-syntax<br>
&gt;&gt; &gt;         (define original (quote-syntax name))<br>
&gt;&gt; &gt;         (provide original))))<br>
&gt;&gt; &gt; (macro)<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; ;;;;; identical.rkt<br>
&gt;&gt; &gt; #lang racket<br>
&gt;&gt; &gt; (require &quot;original.rkt&quot;)<br>
&gt;&gt; &gt; (define-syntax (macro stx)<br>
&gt;&gt; &gt;   (with-syntax {[orig original]}<br>
&gt;&gt; &gt;     #&#39;(begin-for-syntax<br>
&gt;&gt; &gt;         (define identical (quote-syntax orig))<br>
&gt;&gt; &gt;         (provide identical))))<br>
&gt;&gt; &gt; (macro)<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; ;;;;; different.rkt<br>
&gt;&gt; &gt; #lang racket<br>
&gt;&gt; &gt; (require &quot;fresh.rkt&quot;)<br>
&gt;&gt; &gt; (define-syntax (macro stx)<br>
&gt;&gt; &gt;   (with-syntax {[name (fresh)]}<br>
&gt;&gt; &gt;     #&#39;(begin-for-syntax<br>
&gt;&gt; &gt;         (define different (quote-syntax name))<br>
&gt;&gt; &gt;         (provide different))))<br>
&gt;&gt; &gt; (macro)<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; ;;;;; check.rkt<br>
&gt;&gt; &gt; #lang racket<br>
&gt;&gt; &gt; (require &quot;fresh.rkt&quot; &quot;original.rkt&quot; &quot;identical.rkt&quot; &quot;different.rkt&quot;)<br>
&gt;&gt; &gt; (begin-for-syntax<br>
&gt;&gt; &gt;   (unless (free-identifier=? original identical)<br>
&gt;&gt; &gt;     (error &#39;fresh &quot;~v != ~v\n&quot; original identical))<br>
&gt;&gt; &gt;   (when (free-identifier=? original different)<br>
&gt;&gt; &gt;     (error &#39;fresh &quot;~v == ~v\n&quot; original different)))<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; --<br>
&gt;&gt; &gt; Carl Eastlund<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; _________________________<br>
&gt;&gt; &gt;   Racket Developers list:<br>
&gt;&gt; &gt;   <a href="http://lists.racket-lang.org/dev" target="_blank">http://lists.racket-lang.org/dev</a><br>
&gt;&gt; &gt;<br>
&gt;&gt;<br>
&gt;<br>
<br>
</div></div></blockquote></div><br></div>