2 using System.Collections;
7 public class MPlist : IEnumerable
19 private MPlist (MSymbol key, object val)
25 public bool IsEmpty { get { return next == null; } }
26 public MPlist Next { get { return next; } }
34 for (MPlist p = this; p.next != null; i++, p = p.next);
39 public MPlist Clone ()
41 MPlist plist = new MPlist (), pl = plist;
43 for (MPlist p = this; p.next != null; p = p.next)
44 pl = pl.Add (p.Key, p.Val);
48 public override string ToString ()
52 for (MPlist p = this; ! p.IsEmpty; p = p.next)
54 str += (p == this ? "(" : " ") + p.Key + ":" + p.Val;
59 public MPlist Find (MSymbol key)
63 for (p = this; ! p.IsEmpty; p = p.next)
69 public object Get (MSymbol key)
71 return Find (key).Val;
74 public MPlist Set (MSymbol key, object val)
83 public MPlist Put (MSymbol key, object val)
85 return Find (key).Set (key, val);
88 public MPlist Push (MSymbol key, object val)
90 MPlist p = new MPlist (Key, Val);
112 public MPlist Add (MSymbol key, object val)
116 for (p = this; ! p.IsEmpty; p = p.next);
117 return p.Push (key, val);
120 // Implement IEnumerable interface.
121 // foreach (MPlist p in plist) { ... }
123 public virtual IEnumerator GetEnumerator ()
125 return new Enumerator (this);
128 private class Enumerator : IEnumerator
130 private MPlist plist;
131 private MPlist current;
133 internal Enumerator (MPlist plist)
138 public object Current
141 if (current == null || current.IsEmpty)
142 throw new InvalidOperationException ();
152 public bool MoveNext ()
157 current = current.next;
158 return (! current.IsEmpty);