Mailing list for all users of the OCaml language and system.
 help / color / mirror / Atom feed
* Objects contrib
@ 1999-06-15 21:45 Fabrice Le Fessant
  1999-06-16  8:13 ` Vyskocil Vladimir
  1999-06-16 15:56 ` Objects contrib: new URL Fabrice Le Fessant
  0 siblings, 2 replies; 8+ messages in thread
From: Fabrice Le Fessant @ 1999-06-15 21:45 UTC (permalink / raw)
  To: caml-list


I have made a small patch to ocaml-2.02 to allow safe casts of objects.
The patch adds two new keywords "implements" and "cast". 

 - "implements" ("implements c1 c2") is used to declare that objects
from a class c1 can be cast to the type of another class
c2. Implements checks at compile time that a such cast is
safe. Polymorphic classes (class ['a] ...)  are not allowed as
"implements" parameters. However, derived classes are allowed 
(class b = [int] t). By default, casting objects to their original class
is always allowed without using "implements", but all other casts must be
precedeed by an "implements" which allows them.

- "cast" ("cast o1 c1") is used to cast an object o1 to the type of a class c1.
A runtime check is performed to verify that the original class of the object
can be cast to the new class (thanks to an "implements" instruction). If
not correct, a (Failure "Cast failure") is raised.

Here is an example of use. Such a cast is interesting to retrieve the
original type of an object after it has been subtyped to be stored in
a generic structure.

class t1 () =
  object 
  method a = 0
  end;;

class t2 () = 
  object
  method b = 1
  method a = 0
  end;;

let o1 = new t1 ();;
let o2 = new t2 ();; (* val o2 : t2 *)

let x = (o2 :> t1);; (* val x : t1 *)
let y = cast x t2;; (* cast x to its original class, val y : t2 *)

implements t2 t1;; (* t2 implements the interface of t1 *)
let x = (o2 :> < >);; (* val x: < > no methods *)
let y = cast x t1;; (* cast x to the interface of t1, val y : t1 *)

let z = cast o1 t2;;  (* ERROR: Failure "Cast failure" *)
implements t1 t2;;    (* ERROR: not (t1 :> t2) *)

This patch is available at:
http://pauillac.inria.fr/~lefessan/src/patch-cast.tar.gz

- Fabrice LE FESSANT

Homepage: http://pauillac.inria.fr/~lefessan




^ permalink raw reply	[flat|nested] 8+ messages in thread
* RE: Objects contrib: new URL ...
@ 1999-06-21 11:41 Don Syme
  0 siblings, 0 replies; 8+ messages in thread
From: Don Syme @ 1999-06-21 11:41 UTC (permalink / raw)
  To: 'Jacques GARRIGUE', fessant; +Cc: caml-list

> So I weaken my statement: casts are not an absolute evil which should
> not be allowed at all, but at least they should be hard to use, enough
> to encourage people to choose other methods when possible.

I'm not in favour of the extensive use of casts, but this 
sounds like the kind of reasoning that was behind SML's syntax for
references and imperative programming, which makes the imperative features
of SML very hard to use.  The problem is that when you really do need to use
casts in an
application, e.g. in window programming, then you'll probably need to use
them a fair bit,
so an awkward syntax could be quite problematic.

Don




^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~1999-06-21 17:41 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
1999-06-15 21:45 Objects contrib Fabrice Le Fessant
1999-06-16  8:13 ` Vyskocil Vladimir
1999-06-16 15:56 ` Objects contrib: new URL Fabrice Le Fessant
1999-06-17  2:26   ` Jacques GARRIGUE
1999-06-17 17:16     ` Fabrice Le Fessant
1999-06-17 18:44       ` Stefan Monnier
1999-06-18  1:19       ` Jacques GARRIGUE
1999-06-21 11:41 Don Syme

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox