[svn] r7619: nemerle/trunk/macros/io.n

VladD2 svnadmin at nemerle.org
Wed Apr 25 16:13:00 CEST 2007


Log:
Refactoring pf make_splice_distribution().

Author: VladD2
Date: Wed Apr 25 16:12:59 2007
New Revision: 7619

Modified:
   nemerle/trunk/macros/io.n

Modified: nemerle/trunk/macros/io.n
==============================================================================
--- nemerle/trunk/macros/io.n	(original)
+++ nemerle/trunk/macros/io.n	Wed Apr 25 16:12:59 2007
@@ -350,7 +350,58 @@
         - store intermediate results in variables
         - return list of evaluators and reference variables in reverse order
      */
-    public make_splice_distribution (str : string, _env : GlobalEnv) : list [PT.PExpr]
+    public make_splice_distribution (str : string, env : GlobalEnv) : list [PT.PExpr]
+    {
+      def makeEllipsisSplaceExpr(env : GlobalEnv, expr : string, isComplexExpr : bool) : PT.PExpr
+      {
+        if (isComplexExpr)
+        {
+          env.Manager.MacroColors.PushUseSiteColor ();
+          try
+          {
+            def pExpr = MainParser.ParseExpr (env, expr);
+            def makeSeqExpr(seqExpr, sepExpr, cnvFuncExpr)
+            {
+              <[ string.Join($sepExpr, NCollectionsUtils.MapToArray($seqExpr, $cnvFuncExpr)) ]>
+            }
+            match (pExpr)
+            {
+              | <[ $seqExpr; $sepExpr; $cnvFuncExpr; ]> => makeSeqExpr(seqExpr, sepExpr, cnvFuncExpr)
+              | <[ $seqExpr; $sepExpr; ]> => makeSeqExpr(seqExpr, sepExpr, <[ Convert.ToString(_) ]>)
+              | _ => makeSeqExpr(pExpr, <[ ", " ]>, <[ Convert.ToString(_) ]>)
+            }
+          }
+          finally { env.Manager.MacroColors.PopColor (); }
+        } else if (expr == "this")
+             <[ string.Join(", ", NCollectionsUtils.MapToArray(this,              Convert.ToString(_))) ]>
+        else <[ string.Join(", ", NCollectionsUtils.MapToArray($(expr : usesite), Convert.ToString(_))) ]>;
+      }      
+      
+      def makeSplaceExpr(env : GlobalEnv, expr : string, isComplexExpr : bool) : PT.PExpr
+      {
+        if (isComplexExpr)
+        {
+          env.Manager.MacroColors.PushUseSiteColor ();
+          try
+          {
+            def pExpr = MainParser.ParseExpr (env, expr);
+            <[ Convert.ToString ($pExpr) ]>
+          }
+          finally { env.Manager.MacroColors.PopColor (); }
+        } else if (expr == "this") <[ Convert.ToString (this) ]>
+        else                       <[ Convert.ToString ($(expr : usesite)) ]>;
+      }
+      
+      make_splice_distribution (str, env, makeSplaceExpr, makeEllipsisSplaceExpr)
+    }
+
+    public make_splice_distribution (
+      str                    : string,
+      _env                   : GlobalEnv,
+      makeSplaceExpr         : GlobalEnv * string * bool -> PT.PExpr, // env * strExpr * isComplexExpr
+      makeEllipsisSplaceExpr : GlobalEnv * string * bool -> PT.PExpr  // env * strExpr * isComplexExpr
+    )
+      : list [PT.PExpr]
     {
       mutable seen_non_alnum = false;
       
@@ -443,35 +494,9 @@
         {
           def end = find_end (1, idx + 2);
           def expr = str.Substring (idx + 2, end - idx - 2);
-          def expr =
-            if (expr == "" || expr == "_" || seen_non_alnum || char.IsDigit(expr[0]))
-            {
-              _env.Manager.MacroColors.PushUseSiteColor ();
-              try
-              {
-                def pExpr = MainParser.ParseExpr (_env, expr);
-                def makeSeqExpr(pExpr)
-                {
-                  def makeSeqExpr(seqExpr, sepExpr, cnvFuncExpr)
-                  {
-                    <[ string.Join($sepExpr, NCollectionsUtils.MapToArray($seqExpr, $cnvFuncExpr)) ]>
-                  }
-                  match (pExpr)
-                  {
-                    | <[ $seqExpr; $sepExpr; $cnvFuncExpr; ]> => makeSeqExpr(seqExpr, sepExpr, cnvFuncExpr)
-                    | <[ $seqExpr; $sepExpr; ]> => makeSeqExpr(seqExpr, sepExpr, <[ Convert.ToString(_) ]>)
-                    | _ => makeSeqExpr(pExpr, <[ ", " ]>, <[ Convert.ToString(_) ]>)
-                  }
-                }
-                
-                if (isSimple) <[ Convert.ToString ($pExpr) ]> else makeSeqExpr(pExpr)
-              }
-              finally { _env.Manager.MacroColors.PopColor (); }
-            } else if (expr == "this")
-              if (isSimple) <[ Convert.ToString (this) ]>
-              else <[ string.Join(", ", NCollectionsUtils.MapToArray(this, Convert.ToString(_))) ]>
-            else if (isSimple) <[ Convert.ToString ($(expr : usesite)) ]>;
-            else <[ string.Join(", ", NCollectionsUtils.MapToArray($(expr : usesite), Convert.ToString(_))) ]>;
+          def isComplexExpr = expr == "" || expr == "_" || seen_non_alnum || char.IsDigit(expr[0]);
+          def expr = if (isSimple) makeSplaceExpr(_env, expr, isComplexExpr) 
+                     else  makeEllipsisSplaceExpr(_env, expr, isComplexExpr);
           loop (expr :: res, end + 1)
         }
         else if (str[nextIndex] == '$')
@@ -488,13 +513,8 @@
           }
           else
           {
-            def expr =
-              if (variable_name == "this") 
-                if (isSimple) <[ Convert.ToString (this) ]>
-                else <[ string.Join(", ", NCollectionsUtils.MapToArray(this, Convert.ToString(_))) ]>
-              else if (isSimple)
-                <[ Convert.ToString ($(variable_name : usesite)) ]>
-              else <[ string.Join(", ", NCollectionsUtils.MapToArray($(variable_name : usesite), Convert.ToString(_))) ]>;
+            def expr = if (isSimple) makeSplaceExpr(_env, variable_name, false) 
+                       else  makeEllipsisSplaceExpr(_env, variable_name, false);
             loop (expr :: res, end)
           }
         }



More information about the svn mailing list