2 using System.Collections;
3 using System.Collections.Generic;
7 namespace System.Xml.Expression
11 public struct Name : IEquatable<Name>
13 private static NameTable nt = new NameTable ();
17 public Name (string str)
22 public static implicit operator Name (string str)
24 return new Name (str);
27 public static implicit operator string (Name name)
32 public static bool operator== (Name n1, Name n2)
34 return (object) n1.name == (object) n2.name;
37 public static bool operator!= (Name n1, Name n2)
39 return (object) n1.name != (object) n2.name;
42 public static bool operator== (Name n1, string n2)
44 return (object) n1.name == (object) n2;
47 public static bool operator!= (Name n1, string n2)
49 return (object) n1.name != (object) n2;
52 public static bool operator== (string n1, Name n2)
54 return (object) n1 == (object) n2.name;
57 public static bool operator!= (string n1, Name n2)
59 return (object) n1 != (object) n2.name;
62 public bool Equals (Name name)
64 return Object.ReferenceEquals (this.name, name.name);
67 public override bool Equals (object obj)
69 return Object.ReferenceEquals (this.name, obj);
72 public override int GetHashCode ()
74 return name.GetHashCode ();
77 public static NameTable Table { get { return nt; } }
79 public override string ToString () { return name; }
82 private static Name Nexpr = "expr";
83 private static Name Ntype = "type";
84 private static Name Nargs = "args";
86 private static Name Ninteger = "integer";
87 private static Name Nstring = "string";
88 private static Name Nboolean = "boolean";
89 private static Name Nsymbol = "symbol";
90 private static Name Nlist = "list";
91 private static Name Nobject = "object";
93 private static Name Ndefun = "defun";
94 private static Name Ndefvar = "defvar";
95 private static Name Nconst = "const";
96 private static Name Nvariable = "variable";
97 private static Name Ndescription = "description";
98 private static Name Npossible_value = "possible-value";
100 private static Name Nfuncall = "funcall";
101 private static Name Nprogn = "progn";
102 private static Name Neval = "eval";
104 internal class Function
106 internal class Lambda
111 public Lambda (XmlNode node, Domain domain) { }
113 public void SetArgs (XmlNode node, int nargs, Domain domain)
115 args = new Xex[nargs];
116 for (i = 0, n = node.FirstChild; i < nargs; n = n.NextSibling)
117 if (n.Name != Noptional && n.Name != Nrest)
118 args[i++] = new Xex (n, domain);
121 public void SetBody (XmlNode node, Domain domain)
123 XmlNodeList nlist = node.ChildNodes;
125 body = new Xex[nlist.Count];
126 for (int i = 0; i < nlist.Count; i++)
127 body[i] = new Xex (nlist[idx], domain);
131 public readonly Name name;
132 public Builtin builtin;
133 public int min_arg, max_arg;
134 internal Lambda lambda;
135 public bool specialp = false;
137 public Function (Name name, Builtin builtin,
138 int min_arg, int max_arg, bool specialp)
141 this.builtin = builtin;
142 this.min_arg = min_arg;
143 this.max_arg = max_arg;
144 this.specialp = specialp;
147 public Function (Name name, int min_arg, int max_arg)
150 this.min_arg = min_arg;
151 this.max_arg = max_arg;
154 public void Setup (XmlNode node, Domain domain)
156 lambda = new Lambda ();
157 node = node.FirstChild;
158 if (node.Name == Nargs)
160 lambda.SetArgs (node, max_arg, domain);
161 node = node.NextSibling;
163 if (node.Name == Nbody)
164 lambda.SetBody (node, domain);
167 public static Name ParseHead (XmlNode node,
168 out int min_arg, out int max_arg)
170 Name name = node.Attributes[Ffname].Value;
171 int nargs = 0, noptions = 0, nrest = 0;
174 for (n = node.FirstChild; n != null; n = n.NextSibling)
176 if (n.Name == Noptional || n.Name == Nrest)
180 if (n.Name == Noptional)
181 for (n = n.NextSibling; n != null; n = n.NextSibling)
188 for (n = n.NextSibling; n != null; n = n.NextSibling)
191 max_arg = nargs + noptions + nrest;
197 public object Call (Xex[] args, Domain domain)
199 Bindings current = domain.bindings;
200 object result = false;
202 Console.Write ("calling (" + this + "(");
204 foreach (Xex e in args)
206 Console.WriteLine (")");
210 foreach (Xex a in args)
212 return builtin (args, domain);
218 for (i = 0; i < min_arg; i++)
220 Xex a = lambda.args[i];
221 bool isdirect = a.args == null;
222 Name name = isdirect ? (Name) a.val : (Name) a.args[0].val;
223 Variable var = new VarMisc (name, null);
227 domain.Bind (bindings, var, args[i]);
229 foreach (Xex e in lambda.body)
231 result = e.Eval (domain);
232 Console.WriteLine (e.ToString () + "=>" + result);
235 Console.WriteLine (")");
236 domain.UnboundTo (current);
241 public override string ToString ()
247 internal abstract class Variable
249 public readonly Name name;
250 public readonly Name type;
253 public Variable (Name name, Name type, Xex value)
266 if (! ValueP (value))
267 throw new Exception ("Invalid value type: " + value);
272 public abstract bool ValueP (object value);
274 public override string ToString () { return name + "(" + type + ")"; }
277 internal class VarInt : Variable
284 public Range[] ranges;
286 public VarInt (Name name, object value) : base (name, Ninteger, value) { }
288 public override bool ValueP (object value)
292 if (! (value is int))
297 foreach (Range r in ranges)
298 if (i >= r.from && i <= r.to)
304 internal class VarStr : Variable
306 public string[] ranges;
308 public VarStr (Name name, object value) : base (name, Nstring, value) { }
310 public override bool ValueP (object value)
314 if (! (value is string))
318 str = (string) value;
319 foreach (string s in ranges)
326 internal class VarBool : Variable
328 public VarBool (Name name, object value)
329 : base (name, Nboolean, value) { }
331 public override bool ValueP (Xex value)
333 if (! (value is bool))
339 internal class VarMisc : Variable
341 public VarMisc (Name name, object value) : base (name, Nobject, value) { }
343 public override bool ValueP (object value)
349 internal class Bindings
351 private Variable vari;
352 private object old_value;
353 private Bindings next;
355 private Bindings (Variable vari, object value)
361 public static Bindings Bind (Bindings bindings,
362 Variable vari, object value)
364 Bindings b = new Bindings (vari, vari.val);
366 b.vari.Value = value;
371 internal Bindings UnboundTo (Bindings boundary)
373 for (Bindings b = this; b != boundary; b = b.next)
374 vari.val = b.old_value;
378 public override string ToString ()
380 string str = "(bindings";
381 for (Bindings b = this; b != null; b = b.next)
388 internal class ThrowException : Exception
393 public ThrowException (Name tag, object value) : base ()
403 public object context;
405 internal Dictionary<Name, Function> functions;
406 internal Dictionary<Name, Variable> variables;
407 internal Bindings bindings;
411 functions = new Dictionary<Name, Function> ();
412 variables = new Dictionary<Name, Variable> ();
415 public Domain (object context) : this (basic, context)
419 public Domain (Domain parent, object context)
421 functions = new Dictionary<Name, Function> (parent.functions);
422 variables = new Dictionary<Name, Function> (parent.variables);
423 this.context = context;
426 internal void Bind (Variable vari, object value)
428 bindings = Bindings.Bind (bindings, vari, value);
431 internal void UnboundTo (Bindings boundary)
433 bindings = bindings.UnboundTo (boundary);
436 public void Defun (Name name, Builtin builtin, int min_arg, int max_arg)
438 Defun (name, builtin, min_arg, max_arg, false);
441 public void Defun (Name name, Builtin builtin,
442 int min_arg, int max_arg, bool specialp)
446 if (functions.TryGetValue (name, out func))
448 if (func.min_arg < min_arg || func.max_arg > max_arg)
449 throw new Exception ("Incompatible argument numbers to override: "
451 func.builtin = builtin;
453 func.min_arg = min_arg;
454 func.max_arg = max_arg;
455 func.specialp = specialp;
460 = new Function (name, builtin, min_arg, max_arg, specialp);
464 internal Function RegisterFunction (XmlNode node)
466 int min_arg, max_arg;
467 Name name = Function.ParseHead (node, out min_arg, out max_arg);
468 Function func = new Function (name, min_arg, max_arg);
470 functions[name] = func;
474 internal Function Defun (XmlNode node)
478 if (! functions.TryGetValue (name, out func))
479 func = RegisterFunction (node);
480 func.Setup (node, this);
483 public void Defvar (Name name, XmlNode node)
487 if (node.Name == Ndescription)
488 node = node.NextSibling;
489 if (node.Name == Nconst)
491 Name type = (Name) node.Attributes[Ntype].Value;
492 string val = node.Value;
493 XmlNodeList range_list = null;
496 node = node.NextSibling;
497 if (node.Name == Npossible_value)
499 range_list = node.ChildNodes;
500 nranges = range_list.Count;
503 if (type == Ninteger)
505 VarInt vi = new VarInt (name, parse_integer (val));
506 if (range_list != null)
508 vi.ranges = new VarInt.Range[nranges];
510 for (int i = 0; i < nranges; i++)
512 XmlNode n = range_list[i];
514 if (n.Name == Nconst)
516 int num = parse_integer (n.Value);
517 vi.ranges[i].from = vi.ranges[i].to = num;
519 else // range_list[i].Name == "range"
522 parse_integer (n.FirstChild.Value);
524 parse_integer (n.LastChild.Value);
530 else if (type == Nstring)
532 VarStr vs = new VarStr (name, val);
533 if (range_list != null)
534 vs.ranges = new string[nranges];
535 for (int i = 0; i < nranges; i++)
536 vs.ranges[i] = range_list[i].Value;
539 else if (type == Nboolean)
541 vari = new VarBool (name, val == "true");
544 throw new Exception ("Unknown type: " + type);
547 vari = new VarMisc (name, null);
548 variables[name] = vari;
551 internal Function GetFunc (Name name)
555 if (! functions.TryGetValue (name, out func))
558 return parent.GetFunc (name);
559 throw new Exception ("Unknown function: " + name);
564 public bool CopyFunc (Domain domain, Name name)
566 Function func = GetFunc (name);
568 domain.functions[name] = func;
572 public void CopyFunc (Domain domain)
574 foreach (KeyValuePair<Name, Function> kv in functions)
575 domain.functions[kv.Key] = kv.Value;
578 internal Variable GetVar (Name name)
582 if (! variables.TryGetValue (name, out vari))
583 variables[name] = vari = new VarMisc (name, null);
587 internal Variable GetVar (Xex e)
589 if (! (e.val is Name))
590 throw new Exception ("Not a symbol" + e.val);
591 return GetVar ((Name) e.val);
594 public override string ToString ()
596 string str = "<(functions";
597 foreach (KeyValuePair<Name, Function> kv in functions)
599 str += ") (variabls";
600 foreach (KeyValuePair<Name, Variable> kv in variables)
603 if (bindings != null)
604 str += " " + bindings;
606 str += " (" + context + ")";
612 public delegate object Builtin (Xex[] args, Domain domain);
614 private static Domain basic = new Domain ();
616 internal static Function Fprogn;
620 basic.Defun ("set", set_value, 2, 2, false);
621 basic.Defun ("=", set_value, 2, 2, false);
622 basic.Defun ("and", and, 1, -1, false);
623 basic.Defun ("&&", and, 1, -1, false);
624 basic.Defun ("or", or, 1, -1, false);
625 basic.Defun ("||", or, 1, -1, false);
626 basic.Defun ("not", not, 1, 1, false);
627 basic.Defun ("!", not, 1, 1, false);
628 basic.Defun ("add", add, 2, -1, false);
629 basic.Defun ("+", add, 2, -1, false);
630 basic.Defun ("mul", mul, 2, -1, false);
631 basic.Defun ("*", mul, 2, -1, false);
632 basic.Defun ("sub", sub, 1, -1, false);
633 basic.Defun ("-", sub, 1, -1, false);
634 basic.Defun ("div", div, 2, -1, false);
635 basic.Defun ("/", div, 2, -1, false);
636 basic.Defun ("mod", mod, 2, 2, false);
637 basic.Defun ("%", mod, 2, 2, false);
638 basic.Defun ("logior", logior, 2, -1, false);
639 basic.Defun ("|", logior, 2, -1, false);
640 basic.Defun ("logand", logand, 2, -1, false);
641 basic.Defun ("&", logand, 2, -1, false);
642 basic.Defun ("add-set", add_set, 2, -1, true);
643 basic.Defun ("+=", add_set, 2, -1, true);
644 basic.Defun ("mul-set", mul_set, 2, -1, true);
645 basic.Defun ("*=", mul_set, 2, -1, true);
646 basic.Defun ("sub-set", sub_set, 2, -1, true);
647 basic.Defun ("-=", sub_set, 2, -1, true);
648 basic.Defun ("div-set", div_set, 2, -1, true);
649 basic.Defun ("/=", div_set, 2, -1, true);
650 basic.Defun ("mod-set", mod_set, 2, 2, true);
651 basic.Defun ("%=", mod_set, 2, 2, true);
652 basic.Defun ("logior-set", logior_set, 2, -1, true);
653 basic.Defun ("|=", logior_set, 2, -1, true);
654 basic.Defun ("logand-set", logand_set, 2, -1, true);
655 basic.Defun ("&=", logand_set, 2, -1, true);
656 basic.Defun ("lsh", lsh, 2, 2, false);
657 basic.Defun ("<<", lsh, 2, 2, false);
658 basic.Defun ("rsh", rsh, 2, 2, false);
659 basic.Defun (">>", rsh, 2, 2, false);
660 basic.Defun ("lsh-set", lsh_set, 2, 2, true);
661 basic.Defun ("<<=", lsh_set, 2, 2, true);
662 basic.Defun ("rsh-set", rsh_set, 2, 2, true);
663 basic.Defun (">>=", rsh_set, 2, 2, true);
664 basic.Defun ("eq", eq, 2, -1, false);
665 basic.Defun ("==", eq, 2, -1, false);
666 basic.Defun ("noteq", noteq, 2, 2, false);
667 basic.Defun ("!=", noteq, 2, 2, false);
668 basic.Defun ("lt", less_than, 2, -1, false);
669 basic.Defun ("<", less_than, 2, -1, false);
670 basic.Defun ("le", less_eq, 2, -1, false);
671 basic.Defun ("<=", less_eq, 2, -1, false);
672 basic.Defun ("gt", greater_than, 2, -1, false);
673 basic.Defun (">", greater_than, 2, -1, false);
674 basic.Defun ("ge", greater_eq, 2, -1, false);
675 basic.Defun (">=", greater_eq, 2, -1, false);
676 basic.Defun ("progn", progn_clause, 0, -1, true);
677 basic.Defun ("expr", progn_clause, 0, -1, true);
678 basic.Defun ("if", if_clause, 2, -1, true);
679 basic.Defun ("when", when_clause, 1, -1, true);
680 basic.Defun ("while", while_clause, 1, -1, true);
682 Fprogn = basic.GetFunc (Nprogn);
685 private static bool is_true (object val)
687 return (val is bool ? (bool) val
688 : val is int ? (int) val == 0
692 private static object set_value (Xex[] args, Domain domain)
694 Variable vari = domain.GetVar (args[0]);
696 vari.Value = args[1].val;
700 private static object and (Xex[] args, Domain domain)
702 foreach (Xex arg in args)
703 if (! is_true (arg.val))
708 private static object or (Xex[] args, Domain domain)
710 foreach (Xex arg in args)
711 if (is_true (arg.val))
716 private static object not (Xex[] args, Domain domain)
718 return ! is_true (args[0].val);
721 private static object add (Xex[] args, Domain domain)
724 foreach (Xex e in args)
729 private static object mul (Xex[] args, Domain domain)
732 foreach (Xex e in args)
737 private static object sub (Xex[] args, Domain domain)
739 int n = (int) args[0].val;
740 if (args.Length == 1)
742 for (int i = 1; i < args.Length; i++)
743 n -= (int) args[i].val;
747 private static object div (Xex[] args, Domain domain)
749 int n = (int) args[0].val;
750 for (int i = 1; i < args.Length; i++)
751 n /= (int) args[i].val;
755 private static object mod (Xex[] args, Domain domain)
757 return ((int) args[0].val % (int) args[1].val);
760 private static object logior (Xex[] args, Domain domain)
763 foreach (Xex e in args)
768 private static object logand (Xex[] args, Domain domain)
770 int n = (int) args[0].val;
771 for (int i = 1; i < args.Length; i++)
772 n &= (int) args[i].val;
776 private static object add_set (Xex[] args, Domain domain)
778 Variable vari = domain.GetVar (args[0]);
779 int n = (int) vari.val;
781 for (int i = 1; i < args.Length; i++)
782 n += (int) args[i].val;
787 private static object mul_set (Xex[] args, Domain domain)
789 Variable vari = domain.GetVar (args[0]);
790 int n = (int) vari.val;
792 for (int i = 1; i < args.Length; i++)
793 n *= (int) args[i].val;
798 private static object sub_set (Xex[] args, Domain domain)
800 Variable vari = domain.GetVar (args[0]);
801 int n = (int) vari.val;
803 for (int i = 1; i < args.Length; i++)
804 n -= (int) args[i].val;
809 private static object div_set (Xex[] args, Domain domain)
811 Variable vari = domain.GetVar (args[0]);
812 int n = (int) vari.val;
814 for (int i = 1; i < args.Length; i++)
815 n /= (int) args[i].val;
820 private static object mod_set (Xex[] args, Domain domain)
822 Variable vari = domain.GetVar (args[0]);
823 int n = (int) vari.val;
825 for (int i = 1; i < args.Length; i++)
826 n %= (int) args[i].val;
831 private static object logior_set (Xex[] args, Domain domain)
833 Variable vari = domain.GetVar (args[0]);
834 int n = (int) vari.val;
836 for (int i = 1; i < args.Length; i++)
837 n |= (int) args[i].val;
842 private static object logand_set (Xex[] args, Domain domain)
844 Variable vari = domain.GetVar (args[0]);
845 int n = (int) vari.val;
847 for (int i = 1; i < args.Length; i++)
848 n &= (int) args[i].val;
853 private static object lsh (Xex[] args, Domain domain)
855 return (int) args[0].val << (int) args[1].val;
858 private static object lsh_set (Xex[] args, Domain domain)
860 Variable vari = domain.GetVar (args[0]);
861 int n = (int) vari.val;
863 n <<= (int) args[1].val;
868 private static object rsh (Xex[] args, Domain domain)
870 return (int) args[0].val >> (int) args[1].val;
873 private static object rsh_set (Xex[] args, Domain domain)
875 Variable vari = domain.GetVar (args[0]);
876 int n = (int) vari.val;
878 n >>= (int) args[1].val;
883 private static object eq (Xex[] args, Domain domain)
885 int n = (int) args[0].val;
887 for (int i = 1; i < args.Length; i++)
888 if (n != (int) args[i].val)
893 private static object noteq (Xex[] args, Domain domain)
895 return ((int) args[0].val != (int) args[1].val);
898 private static object less_than (Xex[] args, Domain domain)
900 int n = (int) args[0].val;
902 for (int i = 1; i < args.Length; i++)
904 int n1 = (int) args[i].val;
912 private static object less_eq (Xex[] args, Domain domain)
914 int n = (int) args[0].val;
915 for (int i = 1; i < args.Length; i++)
917 int n1 = (int) args[i].val;
925 private static object greater_than (Xex[] args, Domain domain)
927 int n = (int) args[0].val;
928 for (int i = 1; i < args.Length; i++)
930 int n1 = (int) args[i].val;
938 private static object greater_eq (Xex[] args, Domain domain)
940 int n = (int) args[0].val;
941 for (int i = 1; i < args.Length; i++)
943 int n1 = (int) args[i].val;
951 private static object progn_clause (Xex[] args, Domain domain)
953 object result = true;
955 foreach (Xex e in args)
956 result = e.Eval (domain);
960 private static object if_clause (Xex[] args, Domain domain)
964 if (is_true (args[0].Eval (domain)))
965 result = args[1].Eval (domain);
969 for (int i = 2; i < args.Length; i++)
970 result = args[i].Eval (domain);
975 private static object when_clause (Xex[] args, Domain domain)
977 if (! is_true (args[0].Eval (domain)))
980 object result = true;
981 for (int i = 1; i < args.Length; i++)
982 result = args[i].Eval (domain);
986 private static object while_clause (Xex[] args, Domain domain)
988 while (is_true (args[0].Eval (domain)))
989 for (int i = 1; i < args.Length; i++)
990 args[i].Eval (domain);
994 // FUNCALL: function != null
995 // VARREF: function == null, args[0] = DIRECT-SYMBOL
996 // DIRECT: function == null, args == null
998 private Function function;
1002 public Xex[] Args { get { return args; } }
1003 public object Val { get { return val; } }
1007 private Xex (object val)
1012 private static Xex macro_expand (Xex[] bindings, Name[] args, Xex e)
1016 if (e.function != null)
1019 xex.function = e.function;
1020 xex.args = new Xex[e.args.Length];
1021 for (int i = e.args.Length - 1; i >= 0; i--)
1022 xex.args[i] = macro_expand (bindings, args, e.args[i]);
1024 else if (e.args != null)
1027 Name name = (Name) e.args[0].val;
1028 for (int i = args.Length - 1; i >= 0; i--)
1029 if (args[i] == name)
1031 xex.function = null;
1032 xex.args = new Xex[1];
1033 xex.args[0] = e.args[0];
1042 internal static int parse_integer (string str)
1044 int len = str.Length;
1045 bool negative = false;
1048 return (len == 0 ? 0 : str[0] - '0');
1053 if (c == '0' && str[1] == 'x')
1056 for (int idx = 2; idx < len; idx++)
1062 i = i * 16 + (c - '0');
1066 i = i * 16 + (c - 'A');
1070 i = i * 16 + (c - 'a');
1079 for (int idx = 1; idx < len; idx++)
1082 if (c < '0' || c > '9')
1084 i = i * 10 + (c - '0');
1086 return negative ? - i : i;
1089 private int pre_parse (XmlNodeList nlist, Domain domain)
1092 foreach (XmlNode node in nlist)
1094 if (node.Name == Ndefun)
1095 domain.RegisterFunction (node);
1096 else if (node.Name == Ndefvar)
1097 domain.Defvar ((Name) node.Attributes[0].Value, node.FirstChild);
1104 private void post_parse (XmlNodeList nlist, Domain domain)
1106 for (int i = 0, j = 0; i < nlist.Count; i++)
1108 XmlNode node = nlist[i];
1110 if (node.Name == Ndefun)
1111 domain.Defun (node);
1112 else if (node.Name != Ndefvar)
1113 args[j++] = new Xex (node, domain);
1117 private void Setup (XmlNode node, Domain domain)
1119 Name name = node.Name;
1123 Name type = node.Attributes[Ntype].Value;
1125 if (type == Ninteger)
1126 val = parse_integer (node.InnerText);
1127 else if (type == Nstring)
1128 val = node.InnerText;
1129 else if (type == Nsymbol)
1130 val = (Name) node.InnerText;
1131 else if (type == Nboolean)
1132 val = node.InnerText == "true";
1133 else if (type == Nlist)
1135 List<Xex> list = new List<Xex> ();
1136 for (XmlNode n = node.FirstChild; n != null; n = n.NextSibling)
1137 list.Add (new Xex (n, domain));
1141 throw new Exception ("Unknown type: " + type);
1143 else if (name == Nvariable)
1146 args[0] = new Xex ((Name) node.Attributes[0].Value);
1150 bool is_macro = false;
1152 if (name == Nfuncall)
1154 name = node.Attributes[0].Value;
1155 if (Nmname == node.Attributes[0].Name)
1159 function = domain.GetFunc (name);
1161 XmlNodeList nlist = node.ChildNodes;
1162 int nargs = nlist.Count;
1164 if (nargs < function.min_arg
1165 || (function.max_arg >= 0 && nargs > function.max_arg))
1166 throw new Exception ("Invalid number of arguments to: "
1167 + name + " " + nargs);
1168 nargs = pre_parse (nlist, domain);
1169 args = new Xex[nargs];
1170 post_parse (nlist, domain);
1174 Function.Lambda lambda = function.lambda;
1175 Xex[] body = lambda.body;
1176 int len = body.Length;
1177 Xex[] newargs = new Xex[len];
1179 for (int i = 0; i < len; i++)
1180 newargs[i] = macro_expand (args, lambda.args, body[i]);
1187 public Xex (string url, Domain domain)
1189 XmlDocument doc = new XmlDocument (Name.Table);
1192 using (XmlTextReader reader = new XmlTextReader (url, Name.Table))
1196 } while (reader.NodeType != XmlNodeType.None
1197 && (reader.NodeType != XmlNodeType.Element
1198 || Nexpr != reader.Name));
1199 if (reader.NodeType == XmlNodeType.None)
1200 throw new Exception ("Node <expr> not found");
1201 node = doc.ReadNode (reader);
1204 Setup (node, domain);
1207 // EXPR = SYMBOL | MTEXT | INTEGER | FUNCALL | PROGN
1208 // FUNCALL = '(' SYMBOL EXPR* ')'
1209 // PROGN = '(' EXPR * ')'
1210 public Xex (XmlNode node, Domain domain)
1212 Setup (node, domain);
1215 public object Eval (Domain domain)
1217 if (function == null)
1221 Variable vari = domain.GetVar ((Name) args[0].val);
1227 val = function.Call (args, domain);
1231 public override string ToString ()
1235 if (function != null)
1237 str = "(" + function.name;
1239 foreach (Xex e in args)
1240 str += " " + e.ToString ();
1243 else if (args != null)
1245 str = (Name) args[0].val;
1247 else if (val != null)
1250 str = "\"" + ((string) val) + "\"";
1252 str = val.ToString ();