19 public bool tailp { get { return (object) key == null; } }
21 public new string ToString ()
25 for (MPlist p = this; ! p.tailp; p = p.next)
27 str += (p == this ? "(" : " ") + p.key.ToString () + ":";
29 str += ((MSymbol) p.val).ToString ();
30 else if (p.val is MPlist)
31 str += ((MPlist) p.val).ToString ();
36 public object get (MSymbol key)
38 if ((object) key == null)
40 for (MPlist p = this; ! p.tailp; p = p.next)
46 public object put (MSymbol key, object val)
50 for (p = this; ! p.tailp; p = p.next)
63 p.next = new MPlist ();
68 public object push (MSymbol key, object val)
70 MPlist p = new MPlist ();
87 object val = this.val;
89 this.key = this.next.key;
90 this.val = this.next.val;
91 this.next = this.next.next;
95 public object add (MSymbol key, object val)
99 for (p = this; ! p.tailp; p = p.next);
104 p.next = new MPlist ();
112 internal class MSymbolData
116 public MSymbolData next;
118 public MSymbolData (string name, MSymbolData next)
125 static internal class MSymbolPool
127 const int MSYMBOL_POOL_SIZE = 1024;
128 static MSymbolData[] pool = new MSymbolData[MSYMBOL_POOL_SIZE];
129 static int[] used = new int[MSYMBOL_POOL_SIZE];
131 static public MSymbolData get_data (string name)
138 for (int i = 0; i < used[0]; i++, data = data.next)
139 if (data.name == name)
142 pool[0] = data = new MSymbolData (name, pool[0]);
148 static public MSymbol nil = new MSymbol ("nil");
149 static public MSymbol t = new MSymbol ("t");
151 private MSymbolData data;
153 public MSymbol (string name)
155 data = MSymbolPool.get_data (name);
158 public new string ToString () { return data.name; }
160 public new bool Equals (object sym) { return ((object) this == sym); }
162 public new int GetHashCode () { return 0; }
164 public static bool operator== (MSymbol sym1, MSymbol sym2)
166 return ((object) sym1.data == (object) sym2.data);
169 public static bool operator!= (MSymbol sym1, MSymbol sym2)
171 return ((object) sym1.data != (object) sym2.data);
174 public object get (MSymbol key)
176 return (data.plist == null ? null : data.plist.get (key));
179 public object put (MSymbol key, object val)
181 if (data.plist == null)
182 data.plist = new MPlist ();
183 return data.plist.put (key, val);