On Tue, Jun 9, 2009 at 11:05 AM, Sam Ruby <span dir="ltr">&lt;<a href="mailto:rubys@intertwingly.net" target="_blank">rubys@intertwingly.net</a>&gt;</span> wrote:<br><br><blockquote style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;" class="gmail_quote">

<a href="http://en.csharp-online.net/ECMA-334:_18._Structs" target="_blank">http://en.csharp-online.net/ECMA-334:_18._Structs</a><br></blockquote><br>Hi Sam, thanks for the pointer. I will read.<br><br><div class="gmail_quote">
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Taking Rational as an example, the following makes sense to me.  Anybody differ?<br>
<br>
  Rational(2,1) ==  2             ==&gt; true<br>
  Rational(1,2) ==  Rational(2,4) ==&gt; true<br>
  Rational(2,1) === 2             ==&gt; false<br>
  Rational(1,2) === Rational(2,4) ==&gt; false</blockquote><div><br>Rational&#39;s may be a bad example, because if I were implementing them, they&#39;d always reduce to canonical form on construction so my last result above would be &quot;true&quot;. However, in the spirit of your question, we can suppose a Rational representation which doesn&#39;t auto-canonicalize. In that case I agree with these outcomes.<br>

<br> </div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">Given the above, the answer to the below is less clear:<br>
<br>
  foo = {}<br>
  foo[Rational(4,2)]=&#39;a&#39;<br>
  foo[Rational(2,1)]=&#39;b&#39;<br>
  foo[2]=&#39;c&#39;<br>
<br>
  foo[Rational(2,1)] ==&gt; &#39;b&#39; ???<br>
  foo[Rational(4,2)] ==&gt; &#39;a&#39; ???<br>
</blockquote><div><br>Since Rational, being a struct, can overload operators (other than ===, !==, &amp;&amp;, ||, and ?:), then your second case should be equivalent to<br><br>  Rational(4,2)[&#39;reverse[]&#39;](foo, &#39;a&#39;)<br>

 </div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">The motivation for the above is the question of whether or not there<br>
will be the possibility of any user visible cohorts.<br>
</blockquote><div><br>User visible cohorts do not violate any principle associated with structs and operator overloading. Indeed, it is impossible for such an extensible framework to prevent library authors from introducing such types themselves. Whether we want to standardize a numeric type with this behavior is another matter. I don&#39;t. That&#39;s one of the reasons I&#39;d build Rationals that auto-canonicalize.<br>

</div></div><br>-- <br>    Cheers,<br>    --MarkM<br>