X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=XmlExpr.cs;h=2e143a21293a4b8bf0430f10333150c66a791a8c;hb=0f44ed40ba80ef72d6a8a835f4b980d6e3db4e50;hp=5c588da340924e928d44e49e6f4cd1227986deed;hpb=4aefe2227f419cc664c8a27eeb5babb382778162;p=m17n%2Fm17n-lib-cs.git
diff --git a/XmlExpr.cs b/XmlExpr.cs
index 5c588da..2e143a2 100644
--- a/XmlExpr.cs
+++ b/XmlExpr.cs
@@ -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 = "";
- str += "\">";
- foreach (Term e in args)
- str += e;
- return (str + "");
+ 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;
+ // ...
public Term (int i) { intval = i; objval = null; }
+ // ...
public Term (Symbol name) { intval = 0; objval = name; }
+ // ...
public Term (string str) { intval = 0; objval = str; }
+ // ...
public Term (List 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
}
}
+ //
public Term (Domain domain, Symbol vname)
{
intval = 0;
objval = domain.GetVar (vname, true);
}
+ // ...
public Term (Domain domain, Symbol fname, Term[] args)
{
intval = 0;
objval = new Funcall (domain, fname, args);
}
+ // ...
public Term (Domain domain, Symbol fname, Symbol vname, Term[] args)
{
intval = 0;
@@ -1809,12 +1835,10 @@ namespace System.Xml.Expression
str += e;
str += "";
}
- else if (objval is Funcall)
- str = "";
- else if (objval is Variable)
- str = "";
else if (objval is Term)
str = "" + objval + "
";
+ 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);