// single list.
internal readonly int max_args;
+ public delegate Term Builtin (Domain domain, Variable vari, Term[] terms);
+
public Function () { }
public Function (Symbol name, bool with_var, int min_args, int max_args)
internal class Subroutine : Function
{
- public Func<Domain, Variable, Term[], Term> builtin;
+ public Builtin builtin;
- public Subroutine (Func<Domain, Variable, Term[], Term> builtin,
- Symbol name, bool with_var,
+ public Subroutine (Builtin builtin, Symbol name, bool with_var,
int min_args, int max_args)
: base (name, with_var, min_args, max_args)
{
internal class SpecialForm : Function
{
- public Func<Domain, Variable, Term[], Term> builtin;
+ public Builtin builtin;
- public SpecialForm (Func<Domain, Variable, Term[], Term> builtin,
- Symbol name, bool with_var,
+ public SpecialForm (Builtin builtin, Symbol name, bool with_var,
int min_args, int max_args)
: base (name, with_var, min_args, max_args)
{
}
}
- public void DefSubr (Func<Domain, Variable, Term[], Term> builtin,
- Symbol name, bool with_var,
- int min_args, int max_args)
+ public void DefSubr (Function.Builtin builtin, Symbol name,
+ bool with_var, int min_args, int max_args)
{
check_func_head (name, with_var, min_args, max_args, false);
functions[name] = new Function.Subroutine (builtin, name, with_var,
min_args, max_args);
}
- public void DefSpecial (Func<Domain, Variable, Term[], Term> builtin,
- Symbol name, bool with_var,
- int min_args, int max_args)
+ public void DefSpecial (Function.Builtin builtin, Symbol name,
+ bool with_var, int min_args, int max_args)
{
check_func_head (name, with_var, min_args, max_args, false);
functions[name] = new Function.SpecialForm (builtin, name, with_var,
Function func = domain.GetFunc (name);
for (node = node.FirstChild; node != null; node = node.NextSibling)
- if (node.Name != Qdescription
- && node.Name != Qargs)
+ if (node.Name != Qdescription && node.Name != Qargs)
break;
+ Console.WriteLine ("found body " + node.Name);
+
Term[] body = Parse (domain, node, null);
if (is_defun)
((Function.Lambda) func).SetBody (body);
private static bool default_stop (XmlNode n) { return n == null; }
- public static Term[] Parse (Domain domain, XmlNode node,
- Func<XmlNode, bool> stop)
+ public delegate bool ParseStop (XmlNode node);
+
+ public static Term[] Parse (Domain domain, XmlNode node, ParseStop stop)
{
if (stop == null)
stop = default_stop;
XmlDocument doc = new XmlDocument (Symbol.NameTable);
XmlNode node;
- using (XmlTextReader reader = new XmlTextReader (url, doc.NameTable))
+ using (XmlTextReader reader = new XmlTextReader (url, Symbol.NameTable))
{
+ reader.WhitespaceHandling = WhitespaceHandling.None;
do {
reader.Read ();
} while (reader.NodeType != XmlNodeType.None