Version française
Home     About     Download     Resources     Contact us    
Browse thread
Re: "Re: [Caml-list] A G'Caml question" + additional info
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: -- (:)
From: Patrick M Doane <patrick@w...>
Subject: Re: "Re: [Caml-list] A G'Caml question" + additional info
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