using System; using M17N.Core; namespace M17N.Core { public struct MProperty { internal MSymbol key; internal object val; public MSymbol Key { get { return this.key;} } public object Val { get { return this.val; } } public MProperty (MSymbol key, object val) { this.key = key; this.val = val; } } public class MPlist { private MProperty prop; private MPlist next; public MPlist () { prop = new MProperty (MSymbol.nil, null); } public bool tailp { get { return prop.key == MSymbol.nil; } } public new string ToString () { string str = ""; for (MPlist p = this; ! p.tailp; p = p.next) { str += (p == this ? "(" : " ") + p.prop.key.ToString () + ":"; if (p.prop.val is MSymbol) str += ((MSymbol) p.prop.val).ToString (); else if (p.prop.val is MPlist) str += ((MPlist) p.prop.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.prop.key == key) return p.prop.val; return null; } public object put (MSymbol key, object val) { MPlist p; for (p = this; ! p.tailp; p = p.next) if (p.prop.key == key) { if (val != null) p.prop.val = val; else p.pop (); return val; } if (val != null) { p.prop.key = key; p.prop.val = val; p.next = new MPlist (); } return val; } public object push (MSymbol key, object val) { MPlist p = new MPlist (); p.prop.key = this.prop.key; p.prop.val = this.prop.val; p.next = this.next; this.prop.key = key; this.prop.val = val; this.next = p; return val; } public object pop () { if (tailp) return null; object val = this.prop.val; this.prop.key = this.next.prop.key; this.prop.val = this.next.prop.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.prop.key = key; p.prop.val = val; p.next = new MPlist (); } return val; } } }