Version française
Home     About     Download     Resources     Contact us    
Browse thread
Oo.copy
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: -- (:)
From: Jacques GARRIGUE <garrigue@k...>
Subject: Re: Oo.copy

>>>>> ESPERET PHILIPPE <100060.2106@compuserve.com> writes:

 >    I cannot understand how to access a fresh copy of an object with
 > O'Caml (Oo seems normally to copy only pointers).  Thank you if someone
 > can explain me how to get such a copy (please see below for an example).

 >    One related problem is : the documentation for O'Caml exists but is not
 > so thick ; it could be useful to have a list where true beginners in
 > OCaml might ask their questions and find examples.

   

 > class virtual 'a matrix(sz,init:int*'a) as self=
 >   val size=sz
 >   val m=Array.create_matrix sz sz init
 >   val zero=init 
 >   virtual printa:'a -> unit
 >   (*method copy()=new matrix(size,zero)
 >    forbidden: One cannot create instances of the virtual class matrix*)
 >   method m=m
 >   method set(i,j,nval:int*int*'a)= m.(i).(j) <- nval
 >   method build(f:int->int->'a)=for i=0 to size-1 do
 >                                  for j=0 to size-1 do 
 >                                    m.(i).(j)<- f i j done done;self
 >   method print()=for i=0 to size-1 do
 >                    for j=0 to size-1 do 
 >                      self#printa m.(i).(j);
 >                      print_char ';' done; 
 >                    print_newline() done
 >   end

 > class int_matrix (sz:int)=
 >   inherit (int) matrix (sz,0)
 >   method printa=print_int
 > end

 > let m=new int_matrix 3;;
 > (m#build (fun i j->i+j))#print();;
 > m#print();;
0;1;2;
1;2;3;
2;3;4;
 > let n=Oo.copy m;;
 > (*let nn=m#copy();;*)
 > m#set(1,1,66);;
 > n#print();;
 > (*nn#print();;*)
0;1;2;
1;66;3;
2;3;4;

The problem is that your array is shared between the two copies.
There are various specific ways to solve it.

One is to add an "unsharing" method in the virtual class, which is
applied after copying.

  val mutable m = ...
  method unshare = m <- Array.map Array.copy m
  method copy = let o = Oo.copy m in o#unshare; o

Then the problem is solved by using
> let n = m#copy;;

This is difficult to have a general way, since mutable data structures 
can get various forms.

	Jacques
---------------------------------------------------------------------------
Jacques Garrigue	Kyoto University      garrigue@kurims.kyoto-u.ac.jp
		<A HREF=http://wwwfun.kurims.kyoto-u.ac.jp/~garrigue/>JG</A>