[
Home
]
[ Index:
by date
|
by threads
]
[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
| Date: | -- (:) |
| From: | Remi Vanicat <vanicat@l...> |
| Subject: | Re: [Caml-list] NaN-safe min and max |
"Yaron Minsky" <yminsky@cs.cornell.edu> writes: > Olivier Andrieu proposed the following code for doing a safe min/max. > Does anyone have any thoughts about this code snippet, and whether it is > or is not a safe use of Obj.magic? > > let min a b = > let o = Obj.repr a in > if Obj.is_block o && Obj.tag o = Obj.double_tag > then Obj.magic (fmin (Obj.magic a) (Obj.magic b)) > else Pervasives.min a b this one is unsafe : the fact that a is a block with a tag Obj.double_tag doesn't proof that the same is true for b even if a and b have the same type : # let i1 = Lazy.lazy_from_val 0.0;; val i1 : float Lazy.t = lazy 0. # let o1 = Obj.repr i1;; val o1 : Obj.t = <abstr> # Obj.is_block o1;; - : bool = true # Obj.tag o1 = Obj.double_tag;; - : bool = true # let i2 = lazy 3;; val i2 : int lazy_t = <lazy> # let o2 = Obj.repr i2;; val o2 : Obj.t = <abstr> # Obj.is_block o2;; - : bool = true # Obj.tag o2 = Obj.double_tag;; - : bool = false both i1 and i2 have the same type, but only the first one is a block of tag Obj.double_tag. A verification have to be done for both argument. -- Rémi Vanicat remi.vanicat@laposte.net ------------------- 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