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 + ""); } } @@ -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);