2 using System.Collections;
7 public class MPlist : IEnumerable
19 private MPlist (MSymbol key, object val)
25 public bool IsEmpty { get { return next == null; } }
27 public new string ToString ()
31 for (MPlist p = this; ! p.IsEmpty; p = p.next)
33 str += (p == this ? "(" : " ") + p.Key.ToString () + ":";
35 str += ((MSymbol) p.Val).ToString ();
36 else if (p.Val is MPlist)
37 str += ((MPlist) p.Val).ToString ();
42 public MPlist find (MSymbol key)
46 for (p = this; ! p.IsEmpty; p = p.next)
52 public object get (MSymbol key)
54 return find (key).Val;
57 public MPlist put (MSymbol key, object val)
59 MPlist p = find (key);
62 return p.push (key, val);
67 public MPlist push (MSymbol key, object val)
69 MPlist p = new MPlist (Key, Val);
91 public MPlist add (MSymbol key, object val)
95 for (p = this; ! p.IsEmpty; p = p.next);
96 return p.push (key, val);
99 // Implement IEnumerable interface.
101 public virtual IEnumerator GetEnumerator ()
103 return new Enumerator (this);
106 private class Enumerator : IEnumerator
108 private MPlist plist;
109 private MPlist current;
111 internal Enumerator (MPlist plist)
116 public object Current
119 if (current == null || current.IsEmpty)
120 throw new InvalidOperationException ();
130 public bool MoveNext ()
134 else if (current.IsEmpty)
137 current = current.next;