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