<?xml version="1.0" encoding="ISO-8859-1"?>

<!DOCTYPE message PUBLIC
  "-//MLarc//DTD MLarc output files//EN"
  "../../mlarc.dtd"[
  <!ATTLIST message
    listname CDATA #REQUIRED
    title CDATA #REQUIRED
  >
]>

  <?xml-stylesheet href="../../mlarc.xsl" type="text/xsl"?>


<message 
  url="2003/11/a33bcd6e98a9ec945c42f2e24c4f7045"
  from="Jacques Garrigue &lt;garrigue@k...&gt;"
  author="Jacques Garrigue"
  date="2003-11-10T01:33:39"
  subject="Re: [Caml-list] Strange physical equality behavior"
  prev="2003/11/09e582c31663ff8716cce84f773350e2"
  next="2003/11/b6fed40b3f32e144dbacec0e814d0d52"
  prev-in-thread="2003/11/01e1b29e39f68e928829da73207a8c30"
  next-in-thread="2003/11/a4fa114bc35fac9ad8b2bce95978fe86"
  prev-thread="2003/11/c1e744886a3affa901d1dcaf0e350359"
  next-thread="2003/11/09e582c31663ff8716cce84f773350e2"
  root="../../"
  period="month"
  listname="caml-list"
  title="Archives of the Caml mailing list">

<thread subject="[Caml-list] Strange physical equality behavior">
<msg 
  url="2003/11/01e1b29e39f68e928829da73207a8c30"
  from="Oleg Trott &lt;oleg_trott@c...&gt;"
  author="Oleg Trott"
  date="2003-11-09T18:34:28"
  subject="[Caml-list] Strange physical equality behavior">
<msg 
  url="2003/11/a33bcd6e98a9ec945c42f2e24c4f7045"
  from="Jacques Garrigue &lt;garrigue@k...&gt;"
  author="Jacques Garrigue"
  date="2003-11-10T01:33:39"
  subject="Re: [Caml-list] Strange physical equality behavior">
<msg 
  url="2003/11/a4fa114bc35fac9ad8b2bce95978fe86"
  from="Oleg Trott &lt;oleg_trott@c...&gt;"
  author="Oleg Trott"
  date="2003-11-10T02:25:58"
  subject="Re: [Caml-list] Strange physical equality behavior">
<msg 
  url="2003/11/9230ae0d897716b56921b56f5d31f9fe"
  from="Jacques Garrigue &lt;garrigue@k...&gt;"
  author="Jacques Garrigue"
  date="2003-11-10T08:29:32"
  subject="Re: [Caml-list] Strange physical equality behavior">
<msg 
  url="2003/11/31b3758dc01ba9496581b9fd7e7c1e48"
  from="Michal Moskal &lt;malekith@p...&gt;"
  author="Michal Moskal"
  date="2003-11-10T18:41:57"
  subject="Re: [Caml-list] Strange physical equality behavior">
<msg 
  url="2003/11/fc1129f81c56884cc7eeba1ab3565fec"
  from="Jacques Garrigue &lt;garrigue@k...&gt;"
  author="Jacques Garrigue"
  date="2003-11-11T01:35:16"
  subject="Re: [Caml-list] Strange physical equality behavior">
</msg>
</msg>
</msg>
</msg>
<msg 
  url="2003/11/50f653064d6e45748cb96c80bc084526"
  from="Oleg Trott &lt;oleg_trott@c...&gt;"
  author="Oleg Trott"
  date="2003-11-11T06:48:41"
  subject="Re: [Caml-list] Strange physical equality behavior">
<msg 
  url="2003/11/fcbf42708ad0d737e60ce7569d4ac60e"
  from="David Brown &lt;caml-list@d...&gt;"
  author="David Brown"
  date="2003-11-11T16:47:13"
  subject="Re: [Caml-list] Strange physical equality behavior">
<msg 
  url="2003/11/a13ba4cc36c14e7d7021336bcbc04024"
  from="William Lovas &lt;wlovas@s...&gt;"
  author="William Lovas"
  date="2003-11-12T00:32:48"
  subject="Re: [Caml-list] Strange physical equality behavior">
</msg>
</msg>
<msg 
  url="2003/11/2fe7f757bc7b5d10efc2915878644160"
  from="brogoff@s..."
  author="brogoff@s..."
  date="2003-11-11T17:08:25"
  subject="Re: [Caml-list] Strange physical equality behavior">
</msg>
</msg>
</msg>
</msg>
</thread>

<contents>
From: Oleg Trott &lt;oleg_trott@columbia.edu&gt;

&gt;         Objective Caml version 3.07+2
&gt; 
&gt; # sin == sin;;
&gt; - : bool = false
&gt; # let f = sin;;
&gt; val f : float -&gt; float = &lt;fun&gt;
&gt; # f == f;;
&gt; - : bool = true
&gt; 
&gt; I don't like the fact that (sin == sin) returns false.

This is coherent with the specification of (==), which says that
it is fully specified only for mutable structures.
(** [e1 == e2] tests for physical equality of [e1] and [e2].
   On integers and characters, physical equality is identical to structural
   equality. On mutable structures, [e1 == e2] is true if and only if
   physical modification of [e1] also affects [e2].
   On non-mutable structures, the behavior of [(==)] is
   implementation-dependent; however, it is guaranteed that
   [e1 == e2] implies [e1 = e2]. *)
And note that:
  # sin = sin;;
  Exception: Invalid_argument "equal: functional value".
so returning false in this case is valid.

This is for the defensive part.

Now the real explanation: primitives (appearing as "external" in the
.mli) are not closures by themselves. A closure is built as needed.
As a result, two different occurences of "sin" will create different
closures.
If this is a problem for you, you should just be careful of wrapping
all your primitives. This is just what "let f = sin" does.
(Note however that the specification doesn't say what should be (==)
for closures either. It just happens to be reflexive in the current
implementation.)

Jacques Garrigue

-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners

</contents>

</message>

