From mboxrd@z Thu Jan 1 00:00:00 1970 Received: (from weis@localhost) by pauillac.inria.fr (8.7.6/8.7.3) id JAA07728 for caml-redistribution; Wed, 7 Oct 1998 09:32:03 +0200 (MET DST) 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 SAA19381 for ; Tue, 6 Oct 1998 18:14:47 +0200 (MET DST) Received: from mad.unice.fr (mad.unice.fr [134.59.10.81]) by nez-perce.inria.fr (8.8.7/8.8.7) with ESMTP id SAA16823 for ; Tue, 6 Oct 1998 18:14:46 +0200 (MET DST) Received: from math.unice.fr (fantino@localhost [127.0.0.1]) by mad.unice.fr (8.8.7/8.8.7) with ESMTP id SAA15974; Tue, 6 Oct 1998 18:12:57 +0200 Sender: weis Message-ID: <361A4189.AFB9947D@math.unice.fr> Date: Tue, 06 Oct 1998 17:12:57 +0100 From: Serge Fantino Organization: Organization X-Mailer: Mozilla 4.05 [en] (X11; I; Linux 2.0.35 i686) MIME-Version: 1.0 To: "Sylvain BOULM'E" CC: caml-list@inria.fr, Vyskocil Vladimir Subject: Re: porte des definitions des variables de classe References: <199810061235.OAA13442@ventoux.lip6.fr> Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: 8bit Sylvain BOULM'E wrote: > Bonjour, > > Il me semble que c'est dans la semantique des classes > de Ocaml, qui supportent desormais les "variables statiques de classes" > partagees par tous les objets de la classe. (Les gens de Ocaml me > corrigeront ...) > > Ainsi, > > class test1 = > object > val v = ref 5 > method get = !v > method set x = v:=x > end;; > > est equivalent a > > class test1 = let v1=ref 5 in > object > val v=v1 > ... > > Dans les 2 cas, > > let a=new test1 and b=new test1 in (b#set 4; a#get);; > > retourne 4. > Effectivement, OCaml-2.0 semble fonctionné suivant ce schéma. Je trouve cette "nouveauté" embarrassante: - elle est ambigue; Cela va a l'encontre du "sens commun". Les variables d'instance sont declarees dans "object": je m'attends donc a ce que la porté de la variable soit locale à une instance de la classe. Lorsque je declare: class test1 = object val v = ref 5 method get = !v method set x = v:=x end;; je m'attends a ce que la variable v soit locale à chaque nouvel objet construit à partir de (new test1). D'ailleurs, il est confondant de voir que la déclaration suivante: class test3 = object val mutable v = 5 method get = v method set x = v<-x end;; se comporte différement de test1 ! - elle n'est pas consistante Rien ne me previent du changement de fonctionnalité dans ce cas particulier. Il suffit de supprimer ou d'ajouter un paramètre à une classe pour en changer complètement la sémantique. Si je redefinis test1 : class test1 (x:int) = object val v = ref x method get = !v method set x = v:=x end;; alors la variable v n'est plus partagée... - elle n'est pas necessaire; Si on en a besoin, on peut simplement partager des variables "statiques" entre différentes instances de la meme classe. Enfin c'est mon avis d'utilisateur. Pour la petite histoire, il m'a fallu tout un weekend pour comprendre pourquoi mon code ne marchait plus sous OCaml-2.0, alors que la version 1.07 marche tres bien... Objectivement votre, Serge Fantino > Par contre c'est different de > > class test2 () = let v1=ref 5 in > object > val v=v1 > ... > > let a=new test2 () and b=new test2 () in (b#set 4; a#get);; > > retourne 5. > > Encore mieux, > > let f=new test2;; > retourne > val f : unit -> test2 = > > Une classe sert en fait a generer (au travers du new) des fonctions > a valeur dans les objets (de cette classe). Et comme pour les autres > fonctions de Caml, on a la possibilite d'utiliser des variables locales... > Sylvain. > > PS: j'aurai pu ecrire aussi test2 sous la forme > > class test2 () = > object > val v=ref 5 > ... > > Il est aussi interessant de remarquer que > > class test3 = > object > val mutable v = 5 > method get = v > method set x = v<-x > end;; > > let a = new test3 and b=new test3 in (b#set 4; a#get);; > > retourne 5