*** empty log message ***
[m17n/m17n-lib-cs.git] / XmlExpr.cs
index 5c588da..2e143a2 100644 (file)
@@ -135,16 +135,20 @@ namespace System.Xml.Expression
          : base (name, min_arg, max_arg)
          {
            this.builtin = builtin;
+           this.setvar = setvar;
          }
 
        public override Term Call (Domain domain, Variable vari, Term[] args)
        {
-         args = (Term[]) args.Clone ();
-         for (int i = 0; i < args.Length; i++)
+         if (args != null)
            {
-             args[i] = args[i].Eval (domain);
-             if (domain.Thrown)
-               return args[i];
+             args = (Term[]) args.Clone ();
+             for (int i = 0; i < args.Length; i++)
+               {
+                 args[i] = args[i].Eval (domain);
+                 if (domain.Thrown)
+                   return args[i];
+               }
            }
          return builtin (domain, vari, args);
        }
@@ -212,7 +216,8 @@ namespace System.Xml.Expression
              }
          }
 
-       public Lambda (Domain domain, Symbol name, bool args_evalled, Symbol[] args)
+       public Lambda (Domain domain, Symbol name,
+                      bool args_evalled, Symbol[] args)
          {
            int nfixed = 0;
            int noptional = 0;
@@ -1557,7 +1562,7 @@ namespace System.Xml.Expression
     public abstract class TermValue
     {
       public virtual Term Eval (Domain domain) { return new Term (this); }
-      public abstract TermValue Clone ();
+      public virtual TermValue Clone () { return this; }
     }
 
     private class Funcall : TermValue
@@ -1576,17 +1581,28 @@ namespace System.Xml.Expression
       public Funcall (Domain domain, Symbol fname, Term[] args)
        {
          func = domain.GetFunc (fname);
+         if (args != null)
+           {
+             int nargs = args.Length;
+             if (nargs < func.min_arg
+                 || (func.max_arg >= 0 && nargs > func.max_arg))
+               throw new Exception ("Invalid number of arguments to: "
+                                    + fname + " " + nargs);
+           }
          this.args = args;
        }
 
       public Funcall (Domain domain, Symbol fname, Symbol vname, Term[] args)
        {
          func = domain.GetFunc (fname);
-         int nargs = args.Length;
-         if (nargs < func.min_arg
-             || (func.max_arg >= 0 && nargs > func.max_arg))
-           throw new Exception ("Invalid number of arguments to: "
-                                + fname + " " + nargs);
+         if (args != null)
+           {
+             int nargs = args.Length;
+             if (nargs < func.min_arg
+                 || (func.max_arg >= 0 && nargs > func.max_arg))
+               throw new Exception ("Invalid number of arguments to: "
+                                    + fname + " " + nargs);
+           }
          this.args = args;
          if (vname != Qnull)
            vari = domain.GetVar (vname, true);
@@ -1614,10 +1630,7 @@ namespace System.Xml.Expression
 
       public override Term Eval (Domain domain)
       {
-       domain.DebugWrite (true, "(({0}", func.name);
-       for (int i = 0; i < args.Length; i++)
-         domain.DebugWrite (false, " {0}", args[i].ToString ());
-       domain.DebugWrite (false, ")");
+       domain.DebugWrite (true, ToString ());
        domain.depth++;
        Term result = func.Call (domain, vari, args);
        domain.depth--;
@@ -1632,13 +1645,18 @@ namespace System.Xml.Expression
 
       public override string ToString ()
       {
-       string str = "<funcall fname=\"" + func.name;
+       string str = "<" + func.name;
+       if (vari != null)
+         str += " vname=\"" + vari.name + "\"";
        if (args == null)
-         return str + "\"/>";
-       str += "\">";
-       foreach (Term e in args)
-         str += e;
-       return (str + "</funcall>");
+         return str + "/>";
+       str += ">";
+       if (func is Function.SpecialForm)
+         str += "...";
+       else
+         foreach (Term e in args)
+           str += e;
+       return (str + "</" + func.name + ">");
       }
     }
 
@@ -1647,10 +1665,15 @@ namespace System.Xml.Expression
       public int intval;
       public object objval;
 
+      // <integer>...</integer>
       public Term (int i) { intval = i; objval = null; }
+      // <symbol>...</symbol>
       public Term (Symbol name) { intval = 0; objval = name; }
+      // <string>...</string>
       public Term (string str) { intval = 0; objval = str; }
+      // <list>...</list>
       public Term (List<Term> list) { intval = 0; objval = list; }
+
       public Term (Term term) { intval = term.intval; objval = term.objval; }
       public Term (TermValue obj) { intval = 0; objval = obj; }
 
@@ -1692,18 +1715,21 @@ namespace System.Xml.Expression
            }
        }
 
+      // <varref vname="VNAME"/>
       public Term (Domain domain, Symbol vname)
        {
          intval = 0;
          objval = domain.GetVar (vname, true);
        }
 
+      // <funcall fname="FNAME">...</funcall>
       public Term (Domain domain, Symbol fname, Term[] args)
        {
          intval = 0;
          objval = new Funcall (domain, fname, args);
        }
 
+      // <funcall fname="FNAME" vname="VNAME">...</funcall>
       public Term (Domain domain, Symbol fname, Symbol vname, Term[] args)
        {
          intval = 0;
@@ -1809,12 +1835,10 @@ namespace System.Xml.Expression
              str += e;
            str += "</list>";
          }
-       else if (objval is Funcall)
-         str = "<funcall fname=\"" + ((Funcall) objval).func.name + "\"/>";
-       else if (objval is Variable)
-         str = "<variable vname=\"" + ((Variable) objval).name + "\"/>";
        else if (objval is Term)
          str = "<quote>" + objval + "</quote>";
+       else if (objval is TermValue)
+         str = ((TermValue) objval).ToString ();
        else
          throw new Exception ("invalid Term object: " + objval);
        return str;
@@ -1906,6 +1930,19 @@ namespace System.Xml.Expression
       return terms;
     }
 
+    public static Term Eval (Domain domain, Term[] terms)
+    {
+      Term result = new Term (0);
+      foreach (Term term in terms)
+       {
+         result = term;
+         if (result.Objval is Funcall)
+           while ((result = result.Eval (domain)).Objval is Funcall);
+       }
+      return result;
+    }
+
+
     public Xexpression (Domain domain, XmlNode node)
     {
       terms = ParseTerms (domain, node);