Version française
Home     About     Download     Resources     Contact us    

This site is updated infrequently. For up-to-date information, please visit the new OCaml website at

Browse thread
Objects contrib
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: 1999-06-17 (15:44)
From: Jacques GARRIGUE <garrigue@k...>
Subject: Re: Objects contrib: new URL ...
> 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". 

This looks both interesting and dangerous.

 Lots of people want such a feature. This is standard in
LISP or JAVA, so why not in Caml?
 A slight improvement: I would rather have cast raise Match_failure
than a standard Failure.  In particular with a match failure you have
position information for where it failed.

 I believe this really goes against what ML is trying to be.
It allows people to write their programs like they would do in JAVA,
that is in a partially unsafe way. "I believe this object will have
type t, so let's cast it to t." What makes you believe so? I don't see
any guarantee for that.
 Another improvement for that would be to use a match construct rather
than only cast, and to have a warning if the match does not contain a
wild card at the end.

 Another problem is that it creates a distinction between classes with
parameters and classes without, which is not very natural.

 It would have been easy to introduce such a feature in the object
system from the beginning: caml objects bear a pointer to their class,
you just have to put the class name in the class.  My guess is that it
was intentionnally left out.

 You can already implement something similar inside the language:

 For each class c create an hash-table referencing the object
 (In fact this should not be a standard hash-table, but a set of weak
  pointers, otherwise your objects will never be GCed as long as you
  don't remove them from the table)

	type empty_obj = < >
	let memo_c : (empty_obj, c) Hashtbl.t = Hashtbl.create 7

	let new_c args =
	  let obj = new c args in
	  Hashtbl.add memo_c (obj :> empty_obj) obj;

	let cast_c obj = Hashtbl.find memo_c (obj :> empty_obj)

 Do not forget to catch Not_found when using cast_c !
 This works for parameterized classes also: you just have to create a
different memo for each parameters.
 You don't have the flexibility of the implements feature, but you
could also implement it by defining cast_c to look into the memos of
all subclasses in the implement hierarchy.


Jacques Garrigue      Kyoto University     garrigue at
		<A HREF=>JG</A>