2 using System.Collections;
7 public struct MProperty
12 public MSymbol Key { get { return this.key;} }
13 public object Val { get { return this.val; } }
15 public MProperty (MSymbol key, object val)
22 public class MPlist : IEnumerable
24 private MProperty prop;
29 prop = new MProperty (MSymbol.nil, null);
32 public bool tailp { get { return prop.key == MSymbol.nil; } }
34 public new string ToString ()
38 for (MPlist p = this; ! p.tailp; p = p.next)
40 str += (p == this ? "(" : " ") + p.prop.key.ToString () + ":";
41 if (p.prop.val is MSymbol)
42 str += ((MSymbol) p.prop.val).ToString ();
43 else if (p.prop.val is MPlist)
44 str += ((MPlist) p.prop.val).ToString ();
49 public object get (MSymbol key)
51 if ((object) key == null)
53 for (MPlist p = this; ! p.tailp; p = p.next)
54 if (p.prop.key == key)
59 public object put (MSymbol key, object val)
63 for (p = this; ! p.tailp; p = p.next)
64 if (p.prop.key == key)
76 p.next = new MPlist ();
81 public object push (MSymbol key, object val)
83 MPlist p = new MPlist ();
85 p.prop.key = this.prop.key;
86 p.prop.val = this.prop.val;
100 object val = this.prop.val;
102 this.prop.key = this.next.prop.key;
103 this.prop.val = this.next.prop.val;
104 this.next = this.next.next;
108 public object add (MSymbol key, object val)
112 for (p = this; ! p.tailp; p = p.next);
117 p.next = new MPlist ();
122 public MPlist find (MSymbol key)
124 for (MPlist p = this; ! p.tailp; p = p.next)
125 if (p.prop.key == key)
130 // Implement IEnumerable interface.
132 public virtual IEnumerator GetEnumerator ()
134 return new Enumerator (this);
137 private class Enumerator : IEnumerator
139 private MPlist plist;
140 private MPlist current;
142 internal Enumerator (MPlist plist)
147 public object Current
150 if (current == null || current.tailp)
151 throw new InvalidOperationException ();
161 public bool MoveNext ()
165 else if (current.tailp)
168 current = current.next;