Attention il y avait un bug  dans la version 0.1c (voir recentes modifications). Pour le corriger la nouvelle version 0.1d contient plusieurs 
changements importants.
L'idee principale est d'autoriser l'"upcast" seulement  à un niveau 
dans l'arbre d'heritage pour verifier le sous-typage.
| "instance of" | "upcast" | "downcast" | |
| Syntax | expr instanceof c | upcast var from c1 to c2 | downcast var from c1 to c2 | 
| Typing | bool | c2 | c2 | 
| Evaluation | true ou false | valeur de var | valeur de var | 
| semantique | implantation | |
| 1. | o "est-un" c1 | ( Cast.check loc o key_c1) | 
upcast o from c1 to c2
| semantique | implantation | |
| 1. |  o est exactement une instance de c1 et c1 herite directement de c2  | 
Cast.check_sonof var c1 c2 | 
| 2. | type de var est un sous-type de c2 | ( var :> c2) | 
downcast o from c1 to c2
| semantique | implantation | |
| 1. | o has type c1 | ( o : c1) | 
| 2. | c2 is a sub-type of c1 | ( c2 :> c1) | 
| 3. | o "is-a" c1 | ( Cast.check loc o key_c1) | 
| 4. | o "is-a" c2 | ( Cast.check loc o key_c2) | 5. | ((Obj.magic o) : c2) | 
on utilise "upcast" o from c1 to c2 (à un niveau d'heritage) pour autoriser le "downcast" à n'importe quel niveau ou on utilise o ":>" c1 pour revenir à la classe de construction
z herite de m m herite de a z est sous-type de a m est sous-type de a donc on peut ecrire cast ((new z) :>a) from a to m ce qui est faux si z n'est pas sous-type de m typiquement m a une methode binaire qui n'apparait pas dans a et qui est heritee par z.
o instanceof cqui verifie si l'instance o est de la classe c ou d'une classe ancetre du point de vue de l'heritage (sans verification de sous-typage).