On Wed, 2007-04-11 at 19:58 -0700, Erick Tryzelaar wrote: > A couple more, not necessarily having to do with the paper: > > 1. warn if not exhaustively matching all patterns. > > > 2. aggregating patterns: > > match x with > | 5 | 6 => ... > | 7 => ... > | _ => ... > endmatch > > and with variable binding: > > match x with > | Cons(?x, Cons(_, _)) | Cons(?x, Empty[int]) => ... > | _ => ... > endmatch
It needs: | (X (?x,?y) | Y (1,?y) with x = 99) => ... i.e. a way to synthesise variables. I proposed this for Ocaml too. The match construction is ugly: match e with | X ?y => y+x is really: let fun f x => y + x in match e with | X ?x => f x but there's no 'let fun' construction. With this representation: | (X (?x,?y) | Y (1,?y) with x = 99) => ... just becomes let fun f (x,y) = .. in match . . with | X (?x,?y) => f (x,y) | Y (1,?y) => f (99,x) Remember let ?a = b in c is just sugar for match b with ?a => c The problem here, trivially, is that there's no 'scope' in which to put the match handler abstraction, because it's a function. Of course you CAN do it by: let f = (fun x,y) => ..) in match . . with | X (?x,?y) => f (x,y) | Y (1,?y) => f (99,x) i.e. use a lambda expression. Felix pattern match handlers automatically inline such a notional handler: in fact what it does is something like: let e = match_argument in if match_X e then f (x,y) replacing x = extractor_x e y = extractor_y e else if match_Y e then f (99,x) replacing .. i.e. it directly replaces x,y etc in the argument term .. BEFORE type checking .. with extractors for the variables. The extractor for y in (_,?y) is just the projection called 'snd' in Ocaml. The match checker is the identity (tuple patterns always match). The extractor for a union member | X y with pattern | X ?y is just ctor_arg (u) ::= u.data (cast to arg type) and the match checker is X = index u ::= X = u.variant where u is just a _uctor_. What we REALLY need is Jay pattern matching, but that requires actively building up the extractors at run time. -- John Skaller <skaller at users dot sf dot net> Felix, successor to C++: http://felix.sf.net ------------------------------------------------------------------------- Take Surveys. Earn Cash. Influence the Future of IT Join SourceForge.net's Techsay panel and you'll get the chance to share your opinions on IT & business topics through brief surveys-and earn cash http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV _______________________________________________ Felix-language mailing list [EMAIL PROTECTED] https://lists.sourceforge.net/lists/listinfo/felix-language