<div dir="ltr">I want a non-probabilistic guarantee of uniqueness, partly because I&#39;d rather not rely on something nondeterministic, and partly because in an ideal solution, I&#39;d like to have control over the printed names of these identifiers.<br>

<div><div><div class="gmail_extra"><br clear="all"><div>Carl Eastlund</div>
<br><div class="gmail_quote">On Fri, May 31, 2013 at 9:27 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">

What does unique mean in this context? Does probabilistically unique<br>
work? If so could you form an identifier with the symbolic form<br>
&quot;unique-id-&quot;+UUID?<br>
<div><div class="h5"><br>
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; I&#39;m having trouble creating identifiers that are unique with respect to<br>
&gt; free-identifier=? and that survive marshaling to compiled code.  The normal<br>
&gt; source of fresh identifiers, generate-temporaries, only guarantees they are<br>
&gt; unique with respect to bound-identifier=?.  The obvious alternative, gensym,<br>
&gt; does not properly survive marshaling -- copies saved in different .zo files<br>
&gt; load as distinct identifiers.  I&#39;ve tried a few alternative methods, none<br>
&gt; more successful than either of these.<br>
&gt;<br>
&gt; Below, there are a few short files that show the difficulties and can be<br>
&gt; used to test other methods.  The first, fresh.rkt, contains the procedure<br>
&gt; used to create fresh identifiers.  The file original.rkt creates a fresh<br>
&gt; identifier at compile time.  The file identical.rkt copies the identifier<br>
&gt; from original.rkt using quote-syntax.  The file different.rkt creates<br>
&gt; another fresh identifier at compile time.  The file check.rkt checks that<br>
&gt; the identifiers from original.rkt and identical.rkt are free-identifier=? to<br>
&gt; each other, and that the identifiers from original.rkt and different.rkt are<br>
&gt; not free-identifier=? to each other.  To run a test, first update fresh.rkt<br>
&gt; to use the appropriate method for creating identifiers, then run &quot;raco make<br>
&gt; check.rkt&quot;.  Some of the methods work when simply running &quot;racket<br>
&gt; check.rkt&quot;, but &quot;raco make&quot; marshals the identifiers to .zo files and<br>
&gt; exposes more problems.<br>
&gt;<br>
&gt; Can anyone suggest an implementation that would work here?<br>
&gt;<br>
&gt; ;;;;; fresh.rkt<br>
&gt; #lang racket<br>
&gt; (begin-for-syntax<br>
&gt;   (require racket/syntax)<br>
&gt;   (define (fresh)<br>
&gt;     ;; does not guarantee free-identifier=?<br>
&gt;     #;(generate-temporary)<br>
&gt;     ;; does not survive marshaling<br>
&gt;     #;(gensym)<br>
&gt;     ;; also does not survive marshaling<br>
&gt;     (begin<br>
&gt;       (define id0 (datum-&gt;syntax #false &#39;fresh))<br>
&gt;       (define ctx (syntax-local-make-definition-context))<br>
&gt;       (syntax-local-bind-syntaxes (list id0) #false ctx)<br>
&gt;       (internal-definition-context-seal ctx)<br>
&gt;       (internal-definition-context-apply ctx id0)))<br>
&gt;   (provide fresh))<br>
&gt;<br>
&gt; ;;;;; original.rkt<br>
&gt; #lang racket<br>
&gt; (require &quot;fresh.rkt&quot;)<br>
&gt; (define-syntax (macro stx)<br>
&gt;   (with-syntax {[name (fresh)]}<br>
&gt;     #&#39;(begin-for-syntax<br>
&gt;         (define original (quote-syntax name))<br>
&gt;         (provide original))))<br>
&gt; (macro)<br>
&gt;<br>
&gt; ;;;;; identical.rkt<br>
&gt; #lang racket<br>
&gt; (require &quot;original.rkt&quot;)<br>
&gt; (define-syntax (macro stx)<br>
&gt;   (with-syntax {[orig original]}<br>
&gt;     #&#39;(begin-for-syntax<br>
&gt;         (define identical (quote-syntax orig))<br>
&gt;         (provide identical))))<br>
&gt; (macro)<br>
&gt;<br>
&gt; ;;;;; different.rkt<br>
&gt; #lang racket<br>
&gt; (require &quot;fresh.rkt&quot;)<br>
&gt; (define-syntax (macro stx)<br>
&gt;   (with-syntax {[name (fresh)]}<br>
&gt;     #&#39;(begin-for-syntax<br>
&gt;         (define different (quote-syntax name))<br>
&gt;         (provide different))))<br>
&gt; (macro)<br>
&gt;<br>
&gt; ;;;;; check.rkt<br>
&gt; #lang racket<br>
&gt; (require &quot;fresh.rkt&quot; &quot;original.rkt&quot; &quot;identical.rkt&quot; &quot;different.rkt&quot;)<br>
&gt; (begin-for-syntax<br>
&gt;   (unless (free-identifier=? original identical)<br>
&gt;     (error &#39;fresh &quot;~v != ~v\n&quot; original identical))<br>
&gt;   (when (free-identifier=? original different)<br>
&gt;     (error &#39;fresh &quot;~v == ~v\n&quot; original different)))<br>
&gt;<br>
&gt; --<br>
&gt; Carl Eastlund<br>
&gt;<br>
</div></div>&gt; _________________________<br>
&gt;   Racket Developers list:<br>
&gt;   <a href="http://lists.racket-lang.org/dev" target="_blank">http://lists.racket-lang.org/dev</a><br>
&gt;<br>
<br>
</blockquote></div><br></div></div></div></div>