using System; using M17N.Core; namespace M17N.Core { public class MPlist { private MSymbol key; private object val; private MPlist next; public MPlist () { key = null; val = null; next = null; } public bool tailp { get { return (object) key == null; } } public new string ToString () { string str = ""; for (MPlist p = this; ! p.tailp; p = p.next) { str += (p == this ? "(" : " ") + p.key.ToString () + ":"; if (p.val is MSymbol) str += ((MSymbol) p.val).ToString (); else if (p.val is MPlist) str += ((MPlist) p.val).ToString (); } return str + ")"; } public object get (MSymbol key) { if ((object) key == null) return null; for (MPlist p = this; ! p.tailp; p = p.next) if (p.key == key) return p.val; return null; } public object put (MSymbol key, object val) { MPlist p; for (p = this; ! p.tailp; p = p.next) if (p.key == key) { if (val != null) p.val = val; else p.pop (); return val; } if (val != null) { p.key = key; p.val = val; p.next = new MPlist (); } return val; } public object push (MSymbol key, object val) { MPlist p = new MPlist (); p.key = this.key; p.val = this.val; p.next = this.next; this.key = key; this.val = val; this.next = p; return val; } public object pop () { if (tailp) return null; object val = this.val; this.key = this.next.key; this.val = this.next.val; this.next = this.next.next; return val; } public object add (MSymbol key, object val) { MPlist p; for (p = this; ! p.tailp; p = p.next); if (val != null) { p.key = key; p.val = val; p.next = new MPlist (); } return val; } } }