Re: [Camllist] Pattern matcher no more supposed to warn on non

Luc Maranget
 Dan Grossman
[
Home
]
[ Index:
by date

by threads
]
[ Message by date: previous  next ] [ Message in thread: previous  next ] [ Thread: previous  next ]
[ Message by date: previous  next ] [ Message in thread: previous  next ] [ Thread: previous  next ]
Date:  20011003 (18:23) 
From:  Dan Grossman <danieljg@c...> 
Subject:  Re: [Camllist] Pattern matcher no more supposed to warn on non 
Luc Maranget wrote: > Argl.... > > Dear Dan, which result would you consider to be correct ? > (1111 ?) > Please tell me... > (Note that I see no consitency either in 3.02 or 3.00,) > > Cheers, thanks, and argl again ! > > Luc If this problem is worth fixing, I suggest that only 1111 or 4444 are reasonable answers. I tend to prefer 1111. For fixing the exhaustivenesschecker and patterncompiler, it's probably easiest to do the most expensive thing: the presence of a when clause basically invalidates the failure of all previous cases  it's like they weren't there. Note that no change needs to be made except when the pattern's type includes a mutable field. Further note that threads are even harder to deal with  they effectively can put evil when clauses everywhere. My familiarity with the ocaml runtime is rusty, but perhaps a patternmatch (where the pattern's type includes a mutable field) could be "rolled back" when the thread is restarted. Of course, you can't reexecute any when clauses! :) Dan > > It is worth a warning in the manual, at least... > > > > > =============== > > > > type y = {mutable c:bool} > > type x = {a:y; b:y} > > > > let f1 (v:x) = > > match v with > > {a = _; b = _} when (v.a.c < false; v.b.c < false; false) > 0 > >  {a = {c=false}; b = {c=false}} > 1 > >  {a = {c=false}; b = {c=true}} > 2 > >  {a = {c=true}; b = {c=false}} > 3 > >  {a = {c=true}; b = {c=true}} > 4 > > > > let f2 (v:x) = > > match v with > > {a = {c=true}; b = _} when (v.a.c < false; v.b.c < false; false) > 0 > >  {a = {c=false}; b = {c=false}} > 1 > >  {a = {c=false}; b = {c=true}} > 2 > >  {a = {c=true}; b = {c=false}} > 3 > >  {a = {c=true}; b = {c=true}} > 4 > > > > let f3 (v:x) = > > match v with > > {a = _; b = {c=true}} when (v.a.c < false; v.b.c < false; false) > 0 > >  {a = {c=false}; b = {c=false}} > 1 > >  {a = {c=false}; b = {c=true}} > 2 > >  {a = {c=true}; b = {c=false}} > 3 > >  {a = {c=true}; b = {c=true}} > 4 > > > > let f4 (v:x) = > > match v with > > {a = {c=true}; b={c=true}} when (v.a.c < false; v.b.c < false; false) > > > 0 > >  {a = {c=false}; b = {c=false}} > 1 > >  {a = {c=false}; b = {c=true}} > 2 > >  {a = {c=true}; b = {c=false}} > 3 > >  {a = {c=true}; b = {c=true}} > 4 > > > > let main () = > > let v1:x = {a = {c=true}; b = {c=true}} in > > let v2:x = {a = {c=true}; b = {c=true}} in > > let v3:x = {a = {c=true}; b = {c=true}} in > > let v4:x = {a = {c=true}; b = {c=true}} in > > print_int (f1 v1); > > print_int (f2 v2); > > print_int (f3 v3); > > print_int (f4 v4) > > > > let _ = main () > >  > > Bug reports: http://caml.inria.fr/bin/camlbugs FAQ: http://caml.inria.fr/FAQ/ > > To unsubscribe, mail camllistrequest@inria.fr Archives: http://caml.inria.fr > >   Dan Grossman www.cs.cornell.edu/home/danieljg H:607 256 0724   5157 Upson Hall danieljg@cs.cornell.edu O:607 255 9834   Bug reports: http://caml.inria.fr/bin/camlbugs FAQ: http://caml.inria.fr/FAQ/ To unsubscribe, mail camllistrequest@inria.fr Archives: http://caml.inria.fr