<div dir="ltr"><div><span style="font-family:arial,sans-serif;font-size:12.727272033691406px">&gt; It looks to me like you can&#39;t specify rational sets with shared</span><br></div><div><span style="font-family:arial,sans-serif;font-size:12.727272033691406px">I didn&#39;t expect to be able to, but I found it interesting that I didn&#39;t hit an error; it just returned a value I didn&#39;t expect. Any idea why direct mutation isn&#39;t working?</span></div>
<div><br></div>&gt; <span style="font-family:arial,sans-serif;font-size:12.727272033691406px">Does OCAML allow rational sets?</span><div><font face="arial, sans-serif">I do not know, I only mentioned OCaml to point out that equality on cyclic data doesn&#39;t always do what you want/hope it to.</font></div>
</div><div class="gmail_extra"><br><br><div class="gmail_quote">On Fri, Jul 26, 2013 at 3:38 PM, Matthias Felleisen <span dir="ltr">&lt;<a href="mailto:matthias@ccs.neu.edu" target="_blank">matthias@ccs.neu.edu</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word"><div><br></div><div>It looks to me like you can&#39;t specify rational sets with shared: </div>
<div><br></div><div><blockquote type="cite"><div><font color="#000000">% racket</font></div><div><font color="#000000">Welcome to Racket v5.90.0.3.</font></div><div><font color="#000000">&gt; (struct vertex (v s p) #:transparent #:mutable)</font></div>
<div><font color="#000000">&gt; (define-values (x y z)</font></div><div><font color="#000000">    (shared ([v0 (vertex 0 (list) succs0)]</font></div><div><font color="#000000"><span style="white-space:pre-wrap">        </span>     [v1 (vertex 1 preds1 (list))]</font></div>
<div class="im"><div><font color="#000000"><span style="white-space:pre-wrap">        </span>     [v2 (vertex 2 preds2 succs2)]</font></div></div><div><font color="#000000"><span style="white-space:pre-wrap">        </span>     [succs0 (list v1 v2)]</font></div>
<div><font color="#000000"><span style="white-space:pre-wrap">        </span>     [preds1 (list v0)]</font></div><div><font color="#000000"><span style="white-space:pre-wrap">        </span>     [preds2 (list v0 v2)]</font></div><div><font color="#000000"><span style="white-space:pre-wrap">        </span>     [succs2 (list v2)])</font></div>
<div><font color="#000000">      (values v0 v1 v2)))</font></div><div><font color="#000000">&gt; x</font></div><div><font color="#000000">#0=(vertex 0 &#39;() (list (vertex 1 &#39;(#0#) &#39;()) #1=(vertex 2 &#39;(#0# #1#) &#39;(#1#))))</font></div>
<div><font color="#000000">&gt; y</font></div><div><font color="#000000">#0=(vertex</font></div><div><font color="#000000">    1</font></div><div><font color="#000000">    (list #1=(vertex 0 &#39;() (list #0# #2=(vertex 2 &#39;(#1# #2#) &#39;(#2#)))))</font></div>
<div><font color="#000000">    &#39;())</font></div><div><font color="#000000">&gt; (set-vertex-s! x (vertex-s y))</font></div><div><font color="#000000">&gt; x</font></div><div><font color="#000000">#0=(vertex</font></div>
<div><font color="#000000">    0</font></div><div><font color="#000000">    #1=&#39;(#0#)</font></div><div><font color="#000000">    (list (vertex 1 #1# &#39;()) #2=(vertex 2 &#39;(#0# #2#) &#39;(#2#))))</font></div></blockquote>
<br></div><div><br></div><div>Does OCAML allow rational sets? -- Matthias</div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><br><div><div><div class="h5"><div>On Jul 26, 2013, at 5:25 PM, Nicholas Labich wrote:</div>
<br></div></div><blockquote type="cite"><div><div class="h5"><div dir="ltr">I&#39;m running into what I find to be surprising behavior with circular structures (vertices of a simple graph).<div><br></div><div>Graphically (see code below to reproduce):</div>
<div>0 --&gt; 1 ;; no problem</div>

<div>2-+      ;; also no problem<br><div> ^-+</div><div><br></div><div>But when I try to add an edge between 0 and 2, I hit an infinite loop at line 88 of racket/set.rkt (in 5.3.3) or line 447 of racket/private/set-types.rkt (in the latest 5.90.0.2), both of which are the hash-proc for set&#39;s gen:equal+hash.</div>


</div><div><br></div><div>Is this the expected behavior (after all, OCaml makes no guarantee of termination for (=) on circular data)? I&#39;m surprised that the self-edge on 2 doesn&#39;t result in the same. I&#39;ve also tried to reproduce the same using `shared&#39;, but I&#39;m assuming I still misunderstand its functionality because the result is not quite what I expect it to be.</div>


<div><br></div><div>Any insight would be much appreciated.</div><div><br></div><div>Nick</div><div><br></div><div><div>Welcome to Racket v5.90.0.2.</div><div>&gt; (struct vertex (value preds succs) #:mutable #:transparent)</div>


<div>&gt; (define v0 (vertex 0 (set) (set)))</div><div>&gt; (define v1 (vertex 1 (set) (set)))</div><div>&gt; (set-vertex-succs! v0 (set v1))</div><div>&gt; (set-vertex-preds! v1 (set v0)) ;; 0 --&gt; 1</div><div>&gt; (equal? v0 (set-first (vertex-preds v1)))</div>


<div>#t</div><div>&gt; (define v2 (vertex 2 (set) (set)))</div><div>&gt; (set-vertex-preds! v2 (set v2)) ;; 2--+</div><div>&gt; (set-vertex-succs! v2 (set v2)) ;; ^--+</div><div>&gt; v2</div><div>#0=(vertex 2 (set #0#) (set #0#))</div>

<div>;; try to add the already existing set</div>
<div>&gt; (set-vertex-succs! v0 (set-add (vertex-succs v0) v2)) ;; loops and loops</div><div>  C-c C-c^Cuser break</div><div>  context...:</div><div> .../racket/collects/racket/private/set-types.rkt:447:3: hash-proc</div>


<div> .../racket/collects/racket/private/set-types.rkt:447:3: hash-proc</div><div> .../racket/collects/racket/private/set-types.rkt:447:3: hash-proc</div><div> .../racket/collects/racket/private/set-types.rkt:447:3: hash-proc...</div>


<div>;; try to make a new set instead</div><div>&gt; (set-vertex-succs! v0 (set v1 v2))</div><div>  C-c C-c^Cuser break</div><div>  context...:</div><div>  .../racket/collects/racket/private/set-types.rkt:447:3: hash-proc</div>

<div>  .../racket/collects/racket/private/set-types.rkt:447:3: hash-proc</div>
<div>  .../racket/collects/racket/private/set-types.rkt:447:3: hash-proc</div><div>  .../racket/collects/racket/private/set-types.rkt:447:3: hash-proc...</div><div>  </div><div>&gt; (shared ([v0 (vertex 0 (set) succs0)]</div>


<div>           [v1 (vertex 1 preds1 (set))]</div><div>           [v2 (vertex 2 preds2 succs2)]</div>           [succs0 (set v1 v2)]<div>           [preds1 (set v0)]</div><div>           [preds2 (set v0 v2)]</div><div>           [succs2 (set v2)])</div>


<div>    (values v0 v1 v2))</div><div>(vertex 0 (set) (set #0=(vertex 2 (set #0#) (set #0#))))</div><div>(vertex 1 (set (vertex 0 (set) (set #0=(vertex 2 (set #0#) (set #0#))))) (set))</div><div>#0=(vertex 2 (set #0#) (set #0#))</div>


<div>;; I must be using `shared&#39; incorrectly...</div></div></div></div></div>
____________________<br>  Racket Users list:<br>  <a href="http://lists.racket-lang.org/users" target="_blank">http://lists.racket-lang.org/users</a><br></blockquote></div><br></div></blockquote></div><br></div>