- 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;
- }
- }
-