[svn] r6510: nemerle/trunk/macros/operators.n
dragonfox
svnadmin at nemerle.org
Fri Aug 11 11:39:20 CEST 2006
Log:
Allow short match in short lambda expressions (bug 733)
Author: dragonfox
Date: Fri Aug 11 11:39:19 2006
New Revision: 6510
Modified:
nemerle/trunk/macros/operators.n
Modified: nemerle/trunk/macros/operators.n
==============================================================================
--- nemerle/trunk/macros/operators.n (original)
+++ nemerle/trunk/macros/operators.n Fri Aug 11 11:39:19 2006
@@ -190,18 +190,34 @@
| <[ _ ]> => <[ parameter: $(Util.tmpname ("_") : dyn) ]>
| <[ $(nm : name) ]> => <[ parameter: $(nm : name) ]>
| <[ $(nm : name) : $ty ]> => <[ parameter: $(nm : name) : $ty ]>
- | _ => Message.FatalError ($"unsupported syntax for parameter of 'parms => body' lambda expression: $x");
+ | _ => Message.FatalError (x.loc, $"unsupported syntax for parameter of 'parms => body' lambda expression: $x");
}
- match (parms) {
- | <[ () ]> => <[ fun () { $body } ]>
- | <[ (..$parms) ]> =>
- def parms = parms.Map (convert_to_parm);
- <[ fun (..$parms) { $body } ]>
+ def convert_to_ref (x) {
+ | <[ parameter: $(nm : name) ]> => PT.PExpr.Ref (x.loc, nm)
+ | _ => Message.FatalError (x.loc, "illegal spliced parameter?")
+ }
+
+ def convert_body (body, parms, loc) {
+ match(body) {
+ | <[ match($(null)) { ..$cases } ]> =>
+ def match_val = match (parms) {
+ | [] => null
+ | [<[ parameter: $(nm : name) ]> as x] => PT.PExpr.Ref (x.loc, nm)
+ | _ :: _ :: _ => PT.PExpr.Tuple (loc, parms.Map (convert_to_ref))
+ | x :: _ => Message.FatalError (x.loc, "illegal spliced parameter?")
+ }
+ PT.PExpr.Match (body.loc, match_val, cases)
+ | _ => body
+ }
+ }
- | _ =>
- def single = convert_to_parm (parms);
- <[ fun (..$([single])) { $body } ]>
+ def loc = parms.loc;
+ def parms = match (parms) {
+ | <[ () ]> => []
+ | <[ (..$parms) ]> => parms.Map (convert_to_parm)
+ | _ => [convert_to_parm (parms)]
}
+ <[ fun (..$parms) $(convert_body (body, parms, loc)) ]>
}
}
More information about the svn
mailing list