+ if (name == Ninteger)
+ {
+ intval = parse_integer (node.InnerText);
+ objval = null;
+ }
+ else
+ {
+ intval = 0;
+ if (name == Nsymbol)
+ objval = (Name) node.InnerText;
+ else if (name == Nstring)
+ objval = node.InnerText.Clone ();
+ else if (name == Nvariable)
+ objval = domain.GetVar ((Name) node.Attributes[0].Value);
+ else if (name == Nlist)
+ {
+ List<Term> list = new List<Term> ();
+ for (node = node.FirstChild; node != null;
+ node = node.NextSibling)
+ list.Add (new Term (node, domain));
+ objval = list;
+ }
+ else
+ {
+ if (name == Nfuncall)
+ name = node.Attributes[0].Value;
+
+ Function func = domain.GetFunc (name);
+ XmlNodeList nlist = node.ChildNodes;
+ int nargs = nlist.Count;
+
+ if (nargs < func.min_arg
+ || (func.max_arg >= 0 && nargs > func.max_arg))
+ throw new Exception ("Invalid number of arguments to: "
+ + name + " " + nargs);
+ Term[] args = new Term[nargs];
+ for (int i = 0; i < nlist.Count; i++)
+ args[i] = new Term (nlist[i], domain);
+ objval = new Funcall (func, args);
+ }
+ }
+ }
+
+ private class Funcall
+ {
+ internal Function func;
+ internal Term[] args;
+
+ public Funcall (Function func, Term[] args)