Mantis Bug Tracker

View Issue Details Jump to Notes ] Issue History ] Print ]
IDProjectCategoryView StatusDate SubmittedLast Update
0000292OCamlOCaml generalpublic2001-02-26 11:232001-03-05 03:22
Reporteradministrator 
Assigned To 
PrioritynormalSeverityminorReproducibilityalways
StatusclosedResolutionfixed 
PlatformOSOS Version
Product Version 
Target VersionFixed in Version 
Summary0000292: Typage objet+variants polymorphes
DescriptionFull_Name: Sylvain Boulme
Version: 3.00
OS: RedHat 6.2
Submission from: cerdon.lip6.fr (132.227.83.56)


[Short English]

It seems that the following code causes a loop during typechecking.

----------------------
[Francais]

Bonjour,

Il semble que le code suivant provoque une boucle lors de la
verification de type. (Le but de ce code est de se servir des variants
pour faire du "multiple dispatch" et contourner l'incompatibilite
heritage/sous-typage dans les methodes "binaires"). Plus precisement,
la boucle a lieu lors du typage de l'expression "papa#egal (cast_point
o)" ci-dessous. En effet, si on met cette expression en commentaire,
la classe "point_colore" passe le typage, et le type obtenu est bien
celui attendu.

Cordialement,

Sylvain.

-------------------------
exception Argument_Inconnu;;

class ['a]point init_x init_y =
  object (s)
    constraint 'a = [< `Point of 'a point | .. ]
    val mutable x = init_x
    val mutable y = init_y
    method deplace i j = x <- x+i; y <- y+j
    method abscisse = x
    method ordonnee = y
    method egal (x:'a) =
      match x with
      | `Point o -> s#abscisse = o#abscisse && s#ordonnee = o#ordonnee
      | _ -> raise Argument_Inconnu
  end;;

let cast_point o = `Point (o:> 'a point);;

class ['a] point_colore init_x init_y init_coul =
  object (s)
    constraint 'a = [< `PointColore of 'a point_colore | .. ]
    inherit ['a] point init_x init_y as papa
    val mutable c = init_coul
    method change_coul nc = c <- nc
    method couleur = c
    method egal x =
      match x with
      | `PointColore o -> s#couleur = o#couleur
                           && papa#egal (cast_point o)
      | x -> papa#egal x
  end;;

TagsNo tags attached.
Attached Files

- Relationships

-  Notes
(0000512)
administrator (administrator)
2001-03-05 03:22

Fixed probably during summer 2000.
(0000513)
administrator (administrator)
2001-03-05 11:20

> Il semble que le code suivant provoque une boucle lors de la
> verification de type. (Le but de ce code est de se servir des variants
> pour faire du "multiple dispatch" et contourner l'incompatibilite
> heritage/sous-typage dans les methodes "binaires"). Plus precisement,
> la boucle a lieu lors du typage de l'expression "papa#egal (cast_point
> o)" ci-dessous. En effet, si on met cette expression en commentaire,
> la classe "point_colore" passe le typage, et le type obtenu est bien
> celui attendu.

Le probleme a disparu dans la version courante.
A noter cependant que les types de variantes ont un peu change', et
qu'il faut maintenant ecrire
    constraint 'a = [> `Point of 'a point]
et
    constraint 'a = [> `PointColore of 'a point_colore]

Cordialement,

        Jacques


- Issue History
Date Modified Username Field Change
2005-11-18 10:13 administrator New Issue


Copyright © 2000 - 2011 MantisBT Group
Powered by Mantis Bugtracker