public object MacroExpand(object lval, ref bool proceed) { if (Lisp.IsFunctor(lval)) { object head = Lisp.Car(lval); object[] args = Lisp.ToArray(Lisp.Cdr(lval)); MacroFuncName name = new MacroFuncName(head, args.Length); MacroFuncDef def; if (m_macro.TryGetValue(head, out def)) { foreach (MacroFuncBase macro in def) { bool completed = false; object res = macro.Execute(this, args, out completed); if (completed) { proceed = true; return res; } } } ControlFormBase control; if (m_control.TryGetValue(head, out control)) return control.MacroExpand(this, args, ref proceed); else return MacroExpand(head, args, ref proceed); } else return lval; }
public bool Equals(MacroFuncName name) { if (name.ID == ID && name.Arity == Arity) return true; else return false; }
public bool Match(MacroFuncName name) { return ID == name.ID && (VariableLength || Arity == name.Arity); }
public XmlForest() { Name = new MacroFuncName(ID.XmlForest); }