[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