*** empty log message ***
authorhanda <handa>
Mon, 14 Sep 2009 23:44:03 +0000 (23:44 +0000)
committerhanda <handa>
Mon, 14 Sep 2009 23:44:03 +0000 (23:44 +0000)
XmlExpr.cs
xex.xml

index 33439d6..610e055 100644 (file)
@@ -81,7 +81,6 @@ namespace System.Xml.Expression
 
     private static Name Nexpr = "expr";
     private static Name Ntype = "type";
-    private static Name Nargs = "args";
 
     private static Name Ninteger = "integer";
     private static Name Nstring = "string";
@@ -91,6 +90,12 @@ namespace System.Xml.Expression
     private static Name Nobject = "object";
 
     private static Name Ndefun = "defun";
+    private static Name Nfname = "fname";
+    private static Name Nargs = "args";
+    private static Name Noptional = "optional";
+    private static Name Nrest = "rest";
+    private static Name Nbody = "body";
+
     private static Name Ndefvar = "defvar";
     private static Name Nconst = "const";
     private static Name Nvariable = "variable";
@@ -99,7 +104,6 @@ namespace System.Xml.Expression
 
     private static Name Nfuncall = "funcall";
     private static Name Nprogn = "progn";
-    private static Name Neval = "eval";
 
     internal class Function
     {
@@ -108,14 +112,13 @@ namespace System.Xml.Expression
        internal Xex[] args;
        internal Xex[] body;
 
-       public Lambda (XmlNode node, Domain domain) { }
-
        public void SetArgs (XmlNode node, int nargs, Domain domain)
        {
          args = new Xex[nargs];
-         for (i = 0, n = node.FirstChild; i < nargs; n = n.NextSibling)
-           if (n.Name != Noptional && n.Name != Nrest)
-             args[i++] = new Xex (n, domain);
+         node = node.FirstChild;
+         for (int i = 0; i < nargs; node = node.NextSibling)
+           if (node.Name != Noptional && node.Name != Nrest)
+             args[i++] = new Xex (node, domain);
        }
 
        public void SetBody (XmlNode node, Domain domain)
@@ -124,7 +127,7 @@ namespace System.Xml.Expression
 
          body = new Xex[nlist.Count];
          for (int i = 0; i < nlist.Count; i++)
-           body[i] = new Xex (nlist[idx], domain);
+           body[i] = new Xex (nlist[i], domain);
        }
       }
 
@@ -167,7 +170,7 @@ namespace System.Xml.Expression
       public static Name ParseHead (XmlNode node,
                                    out int min_arg, out int max_arg)
       {
-       Name name = node.Attributes[Ffname].Value;
+       Name name = node.Attributes[Nfname].Value;
        int nargs = 0, noptions = 0, nrest = 0;
        XmlNode n;
            
@@ -177,14 +180,14 @@ namespace System.Xml.Expression
              break;
            nargs++;
          }
-       if (n.Name == Noptional)
+       if (n != null && n.Name == Noptional)
          for (n = n.NextSibling; n != null; n = n.NextSibling)
            {
              if (n.Name == Nrest)
                break;
              noptions++;
            }
-       if (n.Name == Nrest)
+       if (n != null && n.Name == Nrest)
          for (n = n.NextSibling; n != null; n = n.NextSibling)
            nrest++;
        min_arg = nargs;
@@ -199,20 +202,21 @@ namespace System.Xml.Expression
        Bindings current = domain.bindings;
        object result = false;
 
-       Console.Write ("calling (" + this + "(");
+       Console.Write ("calling (" + this);
        try {
          foreach (Xex e in args)
-           Console.Write (e);
-         Console.WriteLine (")");
+           Console.Write (" " + e);
+         Console.Write (") => ");
          if (builtin != null)
            {
              if (! specialp)
                foreach (Xex a in args)
-                 a.Eval ();
-             return builtin (args, domain);
+                 if (a.Eval (domain) == null)
+                   throw new Exception ("evaled to null");
+             result = builtin (args, domain);
+             Console.WriteLine (result);
+             return result;
            }
-         if (lambda == null)
-           return null;
 
          int i;
          for (i = 0; i < min_arg; i++)
@@ -222,17 +226,16 @@ namespace System.Xml.Expression
              Name name = isdirect ? (Name) a.val : (Name) a.args[0].val;
              Variable var = new VarMisc (name, null);
 
-             if (! isdirect)
-               args[i].Eval ();
-             domain.Bind (bindings, var, args[i]);
+             domain.variables[name] = var;
+             if (isdirect)
+               domain.Bind (var, args[i]);
+             else
+               domain.Bind (var, args[i].Eval (domain));
            }
          foreach (Xex e in lambda.body)
-           {
-             result = e.Eval (domain);
-             Console.WriteLine (e.ToString () + "=>" + result);
-           }
+           result = e.Eval (domain);
+         Console.WriteLine (result);
        } finally {
-         Console.WriteLine (")");
          domain.UnboundTo (current);
        }
        return result;
@@ -250,7 +253,7 @@ namespace System.Xml.Expression
       public readonly Name type;
       internal object val;
 
-      public Variable (Name name, Name type, Xex value)
+      public Variable (Name name, Name type, object value)
       {
        if (value != null)
          Value = value;
@@ -328,7 +331,7 @@ namespace System.Xml.Expression
       public VarBool (Name name, object value)
        : base (name, Nboolean, value) { }
 
-      public override bool ValueP (Xex value)
+      public override bool ValueP (object value)
       {
        if (! (value is bool))
          return false;
@@ -419,7 +422,7 @@ namespace System.Xml.Expression
       public Domain (Domain parent, object context)
       {
        functions = new Dictionary<Name, Function> (parent.functions);
-       variables = new Dictionary<Name, Function> (parent.variables);
+       variables = new Dictionary<Name, Variable> (parent.variables);
        this.context = context;
       }
 
@@ -430,7 +433,8 @@ namespace System.Xml.Expression
 
       internal void UnboundTo (Bindings boundary)
       {
-       bindings = bindings.UnboundTo (boundary);
+       if (bindings != null)
+         bindings = bindings.UnboundTo (boundary);
       }
 
       public void Defun (Name name, Builtin builtin, int min_arg, int max_arg)
@@ -473,11 +477,13 @@ namespace System.Xml.Expression
 
       internal Function Defun (XmlNode node)
       {
+       Name name = node.Attributes[Nfname].Value;
        Function func;
 
        if (! functions.TryGetValue (name, out func))
          func = RegisterFunction (node);
        func.Setup (node, this);
+       return func;
       }
 
       public void Defvar (Name name, XmlNode node)
@@ -553,11 +559,7 @@ namespace System.Xml.Expression
        Function func;
 
        if (! functions.TryGetValue (name, out func))
-         {
-           if (parent != null)
-             return parent.GetFunc (name);
-           throw new Exception ("Unknown function: " + name);
-         }
+         throw new Exception ("Unknown function: " + name);
        return func;
       }
 
@@ -673,6 +675,7 @@ namespace System.Xml.Expression
       basic.Defun (">", greater_than, 2, -1, false);
       basic.Defun ("ge", greater_eq, 2, -1, false);
       basic.Defun (">=", greater_eq, 2, -1, false);
+      basic.Defun ("eval", eval_clause, 1, 1, true);
       basic.Defun ("progn", progn_clause, 0, -1, true);
       basic.Defun ("expr", progn_clause, 0, -1, true);
       basic.Defun ("if", if_clause, 2, -1, true);
@@ -726,270 +729,275 @@ namespace System.Xml.Expression
       return n;
     }
 
-      private static object mul (Xex[] args, Domain domain)
-      {
-       int n = 1;
-       foreach (Xex e in args)
-         n *= (int) e.val;
-       return n;
-      }
-
-      private static object sub (Xex[] args, Domain domain)
-      {
-       int n = (int) args[0].val;
-       if (args.Length == 1)
-         return - n;
-       for (int i = 1; i < args.Length; i++)
-         n -= (int) args[i].val;
-       return n;
-      }
+    private static object mul (Xex[] args, Domain domain)
+    {
+      int n = 1;
+      foreach (Xex e in args)
+       n *= (int) e.val;
+      return n;
+    }
 
-      private static object div (Xex[] args, Domain domain)
-      {
-       int n = (int) args[0].val;
-       for (int i = 1; i < args.Length; i++)
-         n /= (int) args[i].val;
-       return n;
-      }
+    private static object sub (Xex[] args, Domain domain)
+    {
+      int n = (int) args[0].val;
+      if (args.Length == 1)
+       return - n;
+      for (int i = 1; i < args.Length; i++)
+       n -= (int) args[i].val;
+      return n;
+    }
 
-      private static object mod (Xex[] args, Domain domain)
-      {
-       return ((int) args[0].val % (int) args[1].val);
-      }
+    private static object div (Xex[] args, Domain domain)
+    {
+      int n = (int) args[0].val;
+      for (int i = 1; i < args.Length; i++)
+       n /= (int) args[i].val;
+      return n;
+    }
 
-      private static object logior (Xex[] args, Domain domain)
-      {
-       int n = 0;
-       foreach (Xex e in args)
-         n |= (int) e.val;
-       return n;
-      }
+    private static object mod (Xex[] args, Domain domain)
+    {
+      return ((int) args[0].val % (int) args[1].val);
+    }
 
-      private static object logand (Xex[] args, Domain domain)
-      {
-       int n = (int) args[0].val;
-       for (int i = 1; i < args.Length; i++)
-         n &= (int) args[i].val;
-       return n;
-      }
+    private static object logior (Xex[] args, Domain domain)
+    {
+      int n = 0;
+      foreach (Xex e in args)
+       n |= (int) e.val;
+      return n;
+    }
 
-      private static object add_set (Xex[] args, Domain domain)
-      {
-       Variable vari = domain.GetVar (args[0]);
-       int n = (int) vari.val;
+    private static object logand (Xex[] args, Domain domain)
+    {
+      int n = (int) args[0].val;
+      for (int i = 1; i < args.Length; i++)
+       n &= (int) args[i].val;
+      return n;
+    }
 
-       for (int i = 1; i < args.Length; i++)
-         n += (int) args[i].val;
-       vari.val = n;
-       return n;
-      }
+    private static object add_set (Xex[] args, Domain domain)
+    {
+      Variable vari = domain.GetVar (args[0]);
+      int n = (int) vari.val;
 
-      private static object mul_set (Xex[] args, Domain domain)
-      {
-       Variable vari = domain.GetVar (args[0]);
-       int n = (int) vari.val;
+      for (int i = 1; i < args.Length; i++)
+       n += (int) args[i].val;
+      vari.val = n;
+      return n;
+    }
 
-       for (int i = 1; i < args.Length; i++)
-         n *= (int) args[i].val;
-       vari.val = n;
-       return n;
-      }
+    private static object mul_set (Xex[] args, Domain domain)
+    {
+      Variable vari = domain.GetVar (args[0]);
+      int n = (int) vari.val;
 
-      private static object sub_set (Xex[] args, Domain domain)
-      {
-       Variable vari = domain.GetVar (args[0]);
-       int n = (int) vari.val;
+      for (int i = 1; i < args.Length; i++)
+       n *= (int) args[i].val;
+      vari.val = n;
+      return n;
+    }
 
-       for (int i = 1; i < args.Length; i++)
-         n -= (int) args[i].val;
-       vari.val = n;
-       return n;
-      }
+    private static object sub_set (Xex[] args, Domain domain)
+    {
+      Variable vari = domain.GetVar (args[0]);
+      int n = (int) vari.val;
 
-      private static object div_set (Xex[] args, Domain domain)
-      {
-       Variable vari = domain.GetVar (args[0]);
-       int n = (int) vari.val;
+      for (int i = 1; i < args.Length; i++)
+       n -= (int) args[i].val;
+      vari.val = n;
+      return n;
+    }
 
-       for (int i = 1; i < args.Length; i++)
-         n /= (int) args[i].val;
-       vari.val = n;
-       return n;
-      }
+    private static object div_set (Xex[] args, Domain domain)
+    {
+      Variable vari = domain.GetVar (args[0]);
+      int n = (int) vari.val;
 
-      private static object mod_set (Xex[] args, Domain domain)
-      {
-       Variable vari = domain.GetVar (args[0]);
-       int n = (int) vari.val;
+      for (int i = 1; i < args.Length; i++)
+       n /= (int) args[i].val;
+      vari.val = n;
+      return n;
+    }
 
-       for (int i = 1; i < args.Length; i++)
-         n %= (int) args[i].val;
-       vari.val = n;
-       return n;
-      }
+    private static object mod_set (Xex[] args, Domain domain)
+    {
+      Variable vari = domain.GetVar (args[0]);
+      int n = (int) vari.val;
 
-      private static object logior_set (Xex[] args, Domain domain)
-      {
-       Variable vari = domain.GetVar (args[0]);
-       int n = (int) vari.val;
+      for (int i = 1; i < args.Length; i++)
+       n %= (int) args[i].val;
+      vari.val = n;
+      return n;
+    }
 
-       for (int i = 1; i < args.Length; i++)
-         n |= (int) args[i].val;
-       vari.val = n;
-       return n;
-      }
+    private static object logior_set (Xex[] args, Domain domain)
+    {
+      Variable vari = domain.GetVar (args[0]);
+      int n = (int) vari.val;
 
-      private static object logand_set (Xex[] args, Domain domain)
-      {
-       Variable vari = domain.GetVar (args[0]);
-       int n = (int) vari.val;
+      for (int i = 1; i < args.Length; i++)
+       n |= (int) args[i].val;
+      vari.val = n;
+      return n;
+    }
 
-       for (int i = 1; i < args.Length; i++)
-         n &= (int) args[i].val;
-       vari.val = n;
-       return n;
-      }
+    private static object logand_set (Xex[] args, Domain domain)
+    {
+      Variable vari = domain.GetVar (args[0]);
+      int n = (int) vari.val;
 
-      private static object lsh (Xex[] args, Domain domain)
-      {
-       return (int) args[0].val << (int) args[1].val;
-      }
+      for (int i = 1; i < args.Length; i++)
+       n &= (int) args[i].val;
+      vari.val = n;
+      return n;
+    }
 
-      private static object lsh_set (Xex[] args, Domain domain)
-      {
-       Variable vari = domain.GetVar (args[0]);
-       int n = (int) vari.val;
+    private static object lsh (Xex[] args, Domain domain)
+    {
+      return (int) args[0].val << (int) args[1].val;
+    }
 
-       n <<= (int) args[1].val;
-       vari.val = n;
-       return n;
-      }
+    private static object lsh_set (Xex[] args, Domain domain)
+    {
+      Variable vari = domain.GetVar (args[0]);
+      int n = (int) vari.val;
 
-      private static object rsh (Xex[] args, Domain domain)
-      {
-       return (int) args[0].val >> (int) args[1].val;
-      }
+      n <<= (int) args[1].val;
+      vari.val = n;
+      return n;
+    }
 
-      private static object rsh_set (Xex[] args, Domain domain)
-      {
-       Variable vari = domain.GetVar (args[0]);
-       int n = (int) vari.val;
+    private static object rsh (Xex[] args, Domain domain)
+    {
+      return (int) args[0].val >> (int) args[1].val;
+    }
 
-       n >>= (int) args[1].val;
-       vari.val = n;
-       return n;
-      }
+    private static object rsh_set (Xex[] args, Domain domain)
+    {
+      Variable vari = domain.GetVar (args[0]);
+      int n = (int) vari.val;
 
-      private static object eq (Xex[] args, Domain domain)
-      {
-       int n = (int) args[0].val;
+      n >>= (int) args[1].val;
+      vari.val = n;
+      return n;
+    }
 
-       for (int i = 1; i < args.Length; i++)
-         if (n != (int) args[i].val)
-           return false;
-       return true;
-      }
+    private static object eq (Xex[] args, Domain domain)
+    {
+      int n = (int) args[0].val;
 
-      private static object noteq (Xex[] args, Domain domain)
-      {
-       return ((int) args[0].val != (int) args[1].val);
-      }
+      for (int i = 1; i < args.Length; i++)
+       if (n != (int) args[i].val)
+         return false;
+      return true;
+    }
 
-      private static object less_than (Xex[] args, Domain domain)
-      {
-       int n = (int) args[0].val;
+    private static object noteq (Xex[] args, Domain domain)
+    {
+      return ((int) args[0].val != (int) args[1].val);
+    }
 
-       for (int i = 1; i < args.Length; i++)
-         {
-           int n1 = (int) args[i].val;
-           if (n >= n1)
-             return false;
-           n = n1;
-         }
-       return true;
-      }
+    private static object less_than (Xex[] args, Domain domain)
+    {
+      int n = (int) args[0].val;
 
-      private static object less_eq (Xex[] args, Domain domain)
-      {
-       int n = (int) args[0].val;
-       for (int i = 1; i < args.Length; i++)
-         {
-           int n1 = (int) args[i].val;
-           if (n > n1)
-             return false;
-           n = n1;
-         }
-       return true;
-      }
+      for (int i = 1; i < args.Length; i++)
+       {
+         int n1 = (int) args[i].val;
+         if (n >= n1)
+           return false;
+         n = n1;
+       }
+      return true;
+    }
 
-      private static object greater_than (Xex[] args, Domain domain)
-      {
-       int n = (int) args[0].val;
-       for (int i = 1; i < args.Length; i++)
-         {
-           int n1 = (int) args[i].val;
-           if (n <= n1)
-             return false;
-           n = n1;
-         }
-       return true;
-      }
+    private static object less_eq (Xex[] args, Domain domain)
+    {
+      int n = (int) args[0].val;
+      for (int i = 1; i < args.Length; i++)
+       {
+         int n1 = (int) args[i].val;
+         if (n > n1)
+           return false;
+         n = n1;
+       }
+      return true;
+    }
 
-      private static object greater_eq (Xex[] args, Domain domain)
-      {
-       int n = (int) args[0].val;
-       for (int i = 1; i < args.Length; i++)
-         {
-           int n1 = (int) args[i].val;
-           if (n < n1)
-             return false;
-           n = n1;
-         }
-       return true;
-      }
+    private static object greater_than (Xex[] args, Domain domain)
+    {
+      int n = (int) args[0].val;
+      for (int i = 1; i < args.Length; i++)
+       {
+         int n1 = (int) args[i].val;
+         if (n <= n1)
+           return false;
+         n = n1;
+       }
+      return true;
+    }
 
-      private static object progn_clause (Xex[] args, Domain domain)
-      {
-       object result = true;
+    private static object greater_eq (Xex[] args, Domain domain)
+    {
+      int n = (int) args[0].val;
+      for (int i = 1; i < args.Length; i++)
+       {
+         int n1 = (int) args[i].val;
+         if (n < n1)
+           return false;
+         n = n1;
+       }
+      return true;
+    }
 
-       foreach (Xex e in args)
-         result = e.Eval (domain);
-       return result;
-      }
+    private static object eval_clause (Xex[] args, Domain domain)
+    {
+      return args[0].Eval (domain);
+    }
 
-      private static object if_clause (Xex[] args, Domain domain)
-      {
-       object result;
+    private static object progn_clause (Xex[] args, Domain domain)
+    {
+      object result = true;
 
-       if (is_true (args[0].Eval (domain)))
-         result = args[1].Eval (domain);
-       else
-         {
-           result = false;
-           for (int i = 2; i < args.Length; i++)
-             result = args[i].Eval (domain);
-         }
-       return result;
-      }
+      foreach (Xex e in args)
+       result = e.Eval (domain);
+      return result;
+    }
 
-      private static object when_clause (Xex[] args, Domain domain)
-      {
-       if (! is_true (args[0].Eval (domain)))
-         return false;
+    private static object if_clause (Xex[] args, Domain domain)
+    {
+      object result;
 
-       object result = true;
-       for (int i = 1; i < args.Length; i++)
-         result = args[i].Eval (domain);
-       return result;
-      }
+      if (is_true (args[0].Eval (domain)))
+       result = args[1].Eval (domain);
+      else
+       {
+         result = false;
+         for (int i = 2; i < args.Length; i++)
+           result = args[i].Eval (domain);
+       }
+      return result;
+    }
 
-      private static object while_clause (Xex[] args, Domain domain)
-      {
-       while (is_true (args[0].Eval (domain)))
-         for (int i = 1; i < args.Length; i++)
-           args[i].Eval (domain);
+    private static object when_clause (Xex[] args, Domain domain)
+    {
+      if (! is_true (args[0].Eval (domain)))
        return false;
-      }
+
+      object result = true;
+      for (int i = 1; i < args.Length; i++)
+       result = args[i].Eval (domain);
+      return result;
+    }
+
+    private static object while_clause (Xex[] args, Domain domain)
+    {
+      while (is_true (args[0].Eval (domain)))
+       for (int i = 1; i < args.Length; i++)
+         args[i].Eval (domain);
+      return false;
+    }
 
     // FUNCALL: function != null
     // VARREF:  function == null, args[0] = DIRECT-SYMBOL
@@ -1009,36 +1017,6 @@ namespace System.Xml.Expression
       this.val = val;
     }
 
-    private static Xex macro_expand (Xex[] bindings, Name[] args, Xex e)
-    {
-      Xex xex;
-
-      if (e.function != null)
-       {
-         xex = new Xex ();
-         xex.function = e.function;
-         xex.args = new Xex[e.args.Length];
-         for (int i = e.args.Length - 1; i >= 0; i--)
-           xex.args[i] = macro_expand (bindings, args, e.args[i]);
-       }
-      else if (e.args != null)
-       {
-         xex = new Xex ();
-         Name name = (Name) e.args[0].val;
-         for (int i = args.Length - 1; i >= 0; i--)
-           if (args[i] == name)
-             return bindings[i];
-         xex.function = null;
-         xex.args = new Xex[1];
-         xex.args[0] = e.args[0];
-       }
-      else
-       {
-         xex = e;
-       }
-      return xex;
-    }
-
     internal static int parse_integer (string str)
     {
       int len = str.Length;
@@ -1147,15 +1125,8 @@ namespace System.Xml.Expression
        }
       else
        {
-         bool is_macro = false;
-
          if (name == Nfuncall)
-           {
-             name = node.Attributes[0].Value;
-             if (Nmname == node.Attributes[0].Name)
-               is_macro = true;
-           }
-
+           name = node.Attributes[0].Value;
          function = domain.GetFunc (name);
 
          XmlNodeList nlist = node.ChildNodes;
@@ -1168,19 +1139,6 @@ namespace System.Xml.Expression
          nargs =  pre_parse (nlist, domain);
          args = new Xex[nargs];
          post_parse (nlist, domain);
-
-         if (is_macro)
-           {
-             Function.Lambda lambda = function.lambda;
-             Xex[] body = lambda.body;
-             int len = body.Length;
-             Xex[] newargs = new Xex[len];
-
-             for (int i = 0; i < len; i++)
-               newargs[i] = macro_expand (args, lambda.args, body[i]);
-             function = Fprogn;
-             args = newargs;
-           }
        }
     }
 
@@ -1195,7 +1153,7 @@ namespace System.Xml.Expression
            reader.Read ();
          } while (reader.NodeType != XmlNodeType.None
                   && (reader.NodeType != XmlNodeType.Element
-                       || Nexpr != reader.Name));
+                      || Nexpr != reader.Name));
          if (reader.NodeType == XmlNodeType.None)
            throw new Exception ("Node <expr> not found");
          node = doc.ReadNode (reader);
diff --git a/xex.xml b/xex.xml
index 09f7c34..6f84e29 100644 (file)
--- a/xex.xml
+++ b/xex.xml
@@ -13,7 +13,7 @@
     <const type="symbol">x</const>
     <const type="integer">10</const>
   </set>
-  <funcall id="temp">
+  <funcall fname="temp">
     <variable vname="x"/>
     <const type="integer">1</const>
   </funcall>