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 private MPlist find (MSymbol key)
63 for (p = this; ! p.IsEmpty; p = p.next)
69 public MPlist Find (MSymbol key)
71 MPlist p = find (key);
73 return (p.IsEmpty ? null : p);
76 public object Get (MSymbol key)
78 return find (key).Val;
81 public MPlist Set (MSymbol key, object val)
90 public MPlist Put (MSymbol key, object val)
92 return find (key).Set (key, val);
95 public MPlist Push (MSymbol key, object val)
97 MPlist p = new MPlist (Key, Val);
119 public MPlist Add (MSymbol key, object val)
123 for (p = this; ! p.IsEmpty; p = p.next);
124 return p.Push (key, val);
127 // Implement IEnumerable interface.
128 // foreach (MPlist p in plist) { ... }
130 public virtual IEnumerator GetEnumerator ()
132 return new Enumerator (this);
135 private class Enumerator : IEnumerator
137 private MPlist plist;
138 private MPlist current;
140 internal Enumerator (MPlist plist)
145 public object Current
148 if (current == null || current.IsEmpty)
149 throw new InvalidOperationException ();
159 public bool MoveNext ()
164 current = current.next;
165 return (! current.IsEmpty);