001: /*
002: * Jatha - a Common LISP-compatible LISP library in Java.
003: * Copyright (C) 1997-2005 Micheal Scott Hewett
004: *
005: * This library is free software; you can redistribute it and/or
006: * modify it under the terms of the GNU Lesser General Public
007: * License as published by the Free Software Foundation; either
008: * version 2.1 of the License, or (at your option) any later version.
009: *
010: * This library is distributed in the hope that it will be useful,
011: * but WITHOUT ANY WARRANTY; without even the implied warranty of
012: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
013: * Lesser General Public License for more details.
014: *
015: * You should have received a copy of the GNU Lesser General Public
016: * License along with this library; if not, write to the Free Software
017: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
018: *
019: *
020: * For further information, please contact Micheal Hewett at
021: * hewett@cs.stanford.edu
022: *
023: */
024:
025: package org.jatha.util;
026:
027: import java.util.*;
028:
029: import org.jatha.dynatype.*;
030: import org.jatha.Jatha;
031:
032: /**
033: * This defines a hash table containing LispSymbol class elements. They are
034: * indexed by LispString class elements.
035: */
036: public class SymbolTable extends TreeMap<String, LispValue> {
037: public static final long serialVersionUID = 1L;
038:
039: // Changed from HashMap to TreeMap, 10 May 2005 (mh), v2.5.0
040:
041: public static final int HASH_TABLE_DEFAULT_SIZE = 4096;
042: public static final float HASH_TABLE_DEFAULT_LOAD_FACTOR = (float) 0.8;
043:
044: private Jatha f_lisp = null;
045:
046: public SymbolTable(Jatha lisp) {
047: super (); // HASH_TABLE_DEFAULT_SIZE, HASH_TABLE_DEFAULT_LOAD_FACTOR);
048: f_lisp = lisp;
049: }
050:
051: public SymbolTable(Jatha lisp, int defaultSize) {
052: super (); // defaultSize, HASH_TABLE_DEFAULT_LOAD_FACTOR);
053: f_lisp = lisp;
054: }
055:
056: public SymbolTable(Jatha lisp, int initialSize, float loadFactor) {
057: super (); // initialSize, loadFactor);
058: f_lisp = lisp;
059: }
060:
061: // Use the Hashtable methods PUT and GET.
062: // The 'value' is supposed to always be a symbol,
063: // but because NIL is both a Symbol and a List, we
064: // must make the type be 'LispValue' instead of
065: // 'LispSymbol'.
066: public synchronized LispValue put(LispString key, LispValue value) {
067: try {
068: super .put(key.getValue(), value); // Index by the Java String.
069: return value;
070: } catch (NullPointerException e) {
071: System.err.println("NullPointerException for " + key + "/"
072: + value + " in SymbolTable.put.");
073: return null;
074: }
075: }
076:
077: // Returns NIL if the entry is not there.
078: public synchronized LispValue get(LispString key) {
079: Object val = super .get(key.getValue()); // Index by the Java String
080:
081: if (val == null)
082: return f_lisp.NIL;
083: else
084: return (LispValue) val;
085: }
086:
087: // This is useful when a symbol is declared a constant.
088: // The old value (a symbol) will be removed and the new
089: // constant will take its place.
090: public synchronized LispValue replace(LispString key,
091: LispValue value) {
092: super .remove(key.getValue());
093:
094: put(key, value);
095:
096: return value;
097: }
098:
099: // date created: Mon Aug 5 11:34:45 2002
100: // created by: Micheal S. Hewett hewett@smi.stanford.edu
101: /**
102: * Returns an Iterator across the symbols of the SymbolTable.
103: * Each symbol is a string.
104: *
105: */
106: public Iterator keys() {
107: return this.keySet().iterator();
108: }
109:
110: }
|