From mboxrd@z Thu Jan 1 00:00:00 1970 Received: (from majordomo@localhost) by pauillac.inria.fr (8.7.6/8.7.3) id SAA18887; Sat, 30 Jun 2001 18:02:16 +0200 (MET DST) X-Authentication-Warning: pauillac.inria.fr: majordomo set sender to owner-caml-list@pauillac.inria.fr using -f Received: from nez-perce.inria.fr (nez-perce.inria.fr [192.93.2.78]) by pauillac.inria.fr (8.7.6/8.7.3) with ESMTP id SAA18875 for ; Sat, 30 Jun 2001 18:02:15 +0200 (MET DST) Received: from fledge.watson.org (fledge.watson.org [204.156.12.50]) by nez-perce.inria.fr (8.11.1/8.10.0) with ESMTP id f5UG2EL01764; Sat, 30 Jun 2001 18:02:14 +0200 (MET DST) Received: from localhost (patrick@localhost) by fledge.watson.org (8.11.3/8.11.3) with SMTP id f5UG1kB62837; Sat, 30 Jun 2001 12:01:47 -0400 (EDT) (envelope-from patrick@watson.org) Date: Sat, 30 Jun 2001 12:01:45 -0400 (EDT) From: Patrick M Doane To: John Max Skaller cc: Jun Furuse , caml-list@inria.fr Subject: Re: "Re: [Caml-list] A G'Caml question" + additional info In-Reply-To: <3B3D503C.E91DDE34@ozemail.com.au> Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII Sender: owner-caml-list@pauillac.inria.fr Precedence: bulk On Sat, 30 Jun 2001, John Max Skaller wrote: > G'caml makes it easier to write readable algorithms, > and to do 'cut and paste' genericity. But it can't do what > you can do in C++. > > This is a good thing, since you can do some pretty > unprincipled things in C++. I agree. Although I'm not advocating that it do everything you can do in C++. > Sure, and in C++ the iterators just don't work. Could you elaborate on this? > > The proposed 'include' feature makes it much easier to > > extend generic values, but doesn't help with derived generics. > > One step at a time. If you _really_ want to do high level > polymorphism, you'll have to use a more modern research language > like FISh 2. What's in the works for the next version of FISh? The current version is very interesting, but not too useful for me until more support for data structures is added. > Objects can help, but really that isn't the answer. > The answer is more like: what can we do to make C++ like > generics properly parametric? > > It is possible to make STL like algorithms in Ocaml now. > The problem is that you have to pass in a LOT of data, such as > functions to deref and increment the iterator. I think that one can implement much of the STL algorithms in the Caml object system (avoiding the need to pass lots of data). It's not very convenient because of the need to convert primitive values into objects though. I'm still a novice with the object type system so we can probably improve this a bit, but here is a basic implementation of STL iterators in Caml object style: class ['a] list_iterator list_init = object (* is there a better way to define eq here? *) val list = list_init method get_list = list method eq (x : 'a list_iterator) = x#get_list = list method get : 'a = List.hd list method incr = new list_iterator (List.tl list) end class ['a] list_obj l = object method iter_begin : 'a list_iterator = new list_iterator l method iter_end : 'a list_iterator = new list_iterator [] end class ['a] array_iterator arr_init idx_init = object val arr = arr_init val idx = idx_init method get_arr = arr method get_idx = idx method eq (x : 'a array_iterator) = x#get_arr == arr && x#get_idx = idx method get : 'a = Array.get arr idx method incr = new array_iterator arr (idx + 1) end class ['a] array_obj a = object method iter_begin : 'a array_iterator = new array_iterator a 0 method iter_end : 'a array_iterator = new array_iterator a (Array.length a) end let rec for_each f first last = if first#eq last then () else ( f first#get; for_each f (first#incr) last ) let l = new list_obj [1;2;3] let a = new array_obj [|1;2;3|] ;; for_each print_int l#iter_begin l#iter_end; for_each print_int a#iter_begin a#iter_end ------------------- Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/ To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr