This may be a consequence of updating mutable state inside a set datastructure.  I haven&#39;t tried yet, but non-cyclic uses of mutable boxes inside sets may have similar results.<br><br clear="all">Carl Eastlund<br><br><div class="gmail_quote">

On Tue, May 8, 2012 at 9:25 AM, 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">

<br>
Looks like a bug. Why don&#39;t you file a bug report?<br>
<div class="HOEnZb"><div class="h5"><br>
<br>
On May 7, 2012, at 6:33 PM, Daniel King wrote:<br>
<br>
&gt; Hi,<br>
&gt;<br>
&gt; The following code snippet is a bit confusing to me. Sets with cyclic structure<br>
&gt; are not equal? even though they meet my intuitive definition of equal. I&#39;m<br>
&gt; curious exactly where my intuition goes wrong.<br>
&gt;<br>
&gt; I imagine the reason why Racket can conclude that the lists are equal is because<br>
&gt; the ordering of the list provides a necessary level of disambiguation. With a<br>
&gt; set, Racket cannot be certain which element should match between the two<br>
&gt; data, and this means potentially following cycles forever? I&#39;m not entirely<br>
&gt; clear on my reasoning, but I think this must be related to the root cause.<br>
&gt;<br>
&gt; Note in the following snippet the let* forms differ only in the data constructor<br>
&gt; used: `set&#39; in the first form and `list&#39; in the second form.<br>
&gt;<br>
&gt; racket@&gt; (let* ((a-box (box #f))<br>
&gt;                (b-box (box #f))<br>
&gt;                (a (set 1 a-box))<br>
&gt;                (b (set 1 b-box)))<br>
&gt;           (set-box! a-box a)<br>
&gt;           (set-box! b-box b)<br>
&gt;           (displayln a)<br>
&gt;           (displayln b)<br>
&gt;           (equal? a b))<br>
&gt; #0=#&lt;set: 1 #&amp;#0#&gt;<br>
&gt; #0=#&lt;set: 1 #&amp;#0#&gt;<br>
&gt; #f<br>
&gt; racket@&gt;  (let* ((a-box (box #f))<br>
&gt;                 (b-box (box #f))<br>
&gt;                 (a (list 1 a-box))<br>
&gt;                 (b (list 1 b-box)))<br>
&gt;            (set-box! a-box a)<br>
&gt;            (set-box! b-box b)<br>
&gt;            (displayln a)<br>
&gt;            (displayln b)<br>
&gt;            (equal? a b))<br>
&gt; #0=(1 #&amp;#0#)<br>
&gt; #0=(1 #&amp;#0#)<br>
&gt; #t<br>
&gt;<br>
&gt; P.S.<br>
&gt;<br>
&gt; For future reference, is this more of users@ material or dev@ material?<br>
&gt;<br>
&gt; --<br>
&gt; Dan King<br>
&gt; College of Computer and Information Science<br>
&gt; Northeastern University<br>
&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>
<br>
<br>
_________________________<br>
  Racket Developers list:<br>
  <a href="http://lists.racket-lang.org/dev" target="_blank">http://lists.racket-lang.org/dev</a><br>
</div></div></blockquote></div><br>