summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2007-08-02 20:51:38 +0000
committerRich Hickey <richhickey@gmail.com>2007-08-02 20:51:38 +0000
commit04c59e81c4f16bfcaef2fdfd3f5bc5d887445045 (patch)
tree0d3056c6acc844f6015141e1d499d7c6538b527e /src
parent3fb1ffaceed047e58d219065deed567930ebeb15 (diff)
Symbol changes
Diffstat (limited to 'src')
-rw-r--r--src/jvm/Reader.g16
-rw-r--r--src/jvm/clojure/lang/Compiler.java36
-rw-r--r--src/jvm/clojure/lang/DynamicVar.java8
-rw-r--r--src/jvm/clojure/lang/Keyword.java2
-rw-r--r--src/jvm/clojure/lang/LispReader.java10
-rw-r--r--src/jvm/clojure/lang/RT.java2
-rw-r--r--src/jvm/clojure/lang/ReaderLexer.java2
-rw-r--r--src/jvm/clojure/lang/ReaderParser.java18
-rw-r--r--src/jvm/clojure/lang/Symbol.java45
9 files changed, 70 insertions, 69 deletions
diff --git a/src/jvm/Reader.g b/src/jvm/Reader.g
index e1fe0e42..40751cd2 100644
--- a/src/jvm/Reader.g
+++ b/src/jvm/Reader.g
@@ -64,9 +64,9 @@ import java.io.PrintWriter;
// END HAND MODIFIED
*/
-final static Symbol DOTDOT = new Symbol("..");
-final static Symbol QUOTE = new Symbol("quote");
-final static Symbol META = new Symbol("meta");
+final static Symbol DOTDOT = Symbol.create(null,"..");
+final static Symbol QUOTE = Symbol.create(null,"quote");
+final static Symbol META = Symbol.create(null,"meta");
public static void main(String[] args) throws Exception {
Writer w = new PrintWriter(System.out);
@@ -156,13 +156,13 @@ val = PersistentHashMap.EMPTY;
;
symbol returns[Symbol val]
- :n = Identifier {$val = new Symbol($n.text);}
- |n = NSIdentifier {$val = new Symbol($n.text);}
+ :n = Identifier {$val = Symbol.intern($n.text);}
+ |n = NSIdentifier {$val = Symbol.intern($n.text);}
|dd = DotDot {$val = DOTDOT;}
;
keyword returns[Keyword val]
- :k = KeywordIdentifier {$val = new Keyword(new Symbol($k.text.substring(1)));}
+ :k = KeywordIdentifier {$val = new Keyword(Symbol.intern($k.text.substring(1)));}
;
@@ -208,13 +208,13 @@ metaExpression returns [Obj val]
fragment
member returns [Object val]
- : '.' i = Identifier {$val = new Symbol($i.text);}
+ : '.' i = Identifier {$val = Symbol.intern($i.text);}
| '.' m = method {$val = $m.val;}
;
fragment
method returns [Object val]
- : i = MethodIdentifier es = args? ')' {$val = RT.cons(new Symbol($i.text.substring(0,$i.text.length()-1)), es);}
+ : i = MethodIdentifier es = args? ')' {$val = RT.cons(Symbol.intern($i.text.substring(0,$i.text.length()-1)), es);}
;
fragment args returns[ISeq val]
diff --git a/src/jvm/clojure/lang/Compiler.java b/src/jvm/clojure/lang/Compiler.java
index 9090c870..3b493153 100644
--- a/src/jvm/clojure/lang/Compiler.java
+++ b/src/jvm/clojure/lang/Compiler.java
@@ -22,22 +22,22 @@ import java.lang.reflect.Modifier;
public class Compiler{
//*
-static Symbol DEF = new Symbol("def");
-static Symbol FN = new Symbol("fn");
-static Symbol DO = new Symbol("do");
-static Symbol IF = new Symbol("if");
-static Symbol OR = new Symbol("or");
-static Symbol AND = new Symbol("and");
-static Symbol LET = new Symbol("let");
-static Symbol LET_STAR_ = new Symbol("let*");
-static Symbol LETFN = new Symbol("letfn");
-static Symbol NOT = new Symbol("not");
-static Symbol NULL_QM_ = new Symbol("null?");
-
-static Symbol IMPORT = new Symbol("import");
-static Symbol USE = new Symbol("use");
-static Symbol _AMP_KEY = new Symbol("&key");
-static Symbol _AMP_REST = new Symbol("&rest");
+static Symbol DEF = Symbol.create(null, "def");
+static Symbol FN = Symbol.create(null, "fn");
+static Symbol DO = Symbol.create(null, "do");
+static Symbol IF = Symbol.create(null, "if");
+static Symbol OR = Symbol.create(null, "or");
+static Symbol AND = Symbol.create(null, "and");
+static Symbol LET = Symbol.create(null, "let");
+static Symbol LET_STAR_ = Symbol.create(null, "let*");
+static Symbol LETFN = Symbol.create(null, "letfn");
+static Symbol NOT = Symbol.create(null, "not");
+static Symbol NULL_QM_ = Symbol.create(null, "null?");
+
+static Symbol IMPORT = Symbol.create(null, "import");
+static Symbol USE = Symbol.create(null, "use");
+static Symbol _AMP_KEY = Symbol.create(null, "&key");
+static Symbol _AMP_REST = Symbol.create(null, "&rest");
static public DynamicVar _CRT_OUT = RT.OUT;
static public DynamicVar _CRT_MODULE = RT.CURRENT_MODULE;
@@ -990,7 +990,7 @@ private static Expr analyzeOr(C context, ISeq form) throws Exception{
if(context != C.STATEMENT)
{
//we'll need a temp var
- tb = new LocalBinding(new Symbol("OR_TEMP"));
+ tb = new LocalBinding(Symbol.create(null, "OR_TEMP"));
registerLocal(tb);
}
@@ -1506,7 +1506,7 @@ static Symbol baseSymbol(Symbol sym){
if(base == sym.name) //no typeHint
return sym;
- return new Symbol(base);
+ return Symbol.intern(null, base);
}
static String baseName(Symbol sym){
diff --git a/src/jvm/clojure/lang/DynamicVar.java b/src/jvm/clojure/lang/DynamicVar.java
index d9ffad79..10b3f7cd 100644
--- a/src/jvm/clojure/lang/DynamicVar.java
+++ b/src/jvm/clojure/lang/DynamicVar.java
@@ -30,7 +30,7 @@ boolean isBound(){
return root != dvals || dvals.get() != null;
}
-public Object get() throws Exception{
+public Object get(){
Binding b = getThreadBinding();
if(b != null)
return b.val;
@@ -39,7 +39,7 @@ public Object get() throws Exception{
throw new IllegalStateException("Var is unbound.");
}
-public Object set(Object val) throws Exception{
+public Object set(Object val){
Binding b = getThreadBinding();
if(b != null)
return (b.val = val);
@@ -58,10 +58,10 @@ public void pushThreadBinding(Object val){
dvals.set(new Binding(val, dvals.get()));
}
-public void popThreadBinding() throws Exception{
+public void popThreadBinding(){
Binding b = dvals.get();
if(b == null)
- throw new Exception("Can't pop unbound ref");
+ throw new IllegalStateException("Can't pop unbound ref");
dvals.set(b.rest);
}
diff --git a/src/jvm/clojure/lang/Keyword.java b/src/jvm/clojure/lang/Keyword.java
index 73f4889a..ccdca37d 100644
--- a/src/jvm/clojure/lang/Keyword.java
+++ b/src/jvm/clojure/lang/Keyword.java
@@ -31,7 +31,7 @@ public Keyword(Symbol sym){
}
public Keyword(String ns, String name){
- this(new Symbol(ns, name));
+ this(Symbol.intern(ns, name));
}
public boolean equals(Object o){
diff --git a/src/jvm/clojure/lang/LispReader.java b/src/jvm/clojure/lang/LispReader.java
index 2511e252..ed9210f1 100644
--- a/src/jvm/clojure/lang/LispReader.java
+++ b/src/jvm/clojure/lang/LispReader.java
@@ -18,10 +18,10 @@ import java.math.BigInteger;
public class LispReader{
-static Symbol QUOTE = new Symbol("quote");
-static Symbol BACKQUOTE = new Symbol("backquote");
-static Symbol UNQUOTE = new Symbol("unquote");
-static Symbol UNQUOTE_SPLICING = new Symbol("unquote-splicing");
+static Symbol QUOTE = Symbol.create(null, "quote");
+static Symbol BACKQUOTE = Symbol.create(null, "backquote");
+static Symbol UNQUOTE = Symbol.create(null, "unquote");
+static Symbol UNQUOTE_SPLICING = Symbol.create(null, "unquote-splicing");
static IFn[] macros = new IFn[256];
static Pattern symbolPat = Pattern.compile("[:]?[\\D&&[^:\\.]][^:\\.]*");
@@ -222,7 +222,7 @@ static private Object interpretToken(String s) throws Exception{
if(ret != null)
return ret;
- return new Symbol(s);
+ return Symbol.intern(null, s);
}
/*
private static Object matchHostName(String s) {
diff --git a/src/jvm/clojure/lang/RT.java b/src/jvm/clojure/lang/RT.java
index dde7e319..44df9e57 100644
--- a/src/jvm/clojure/lang/RT.java
+++ b/src/jvm/clojure/lang/RT.java
@@ -18,7 +18,7 @@ import java.io.*;
public class RT{
-static public Symbol T = new Symbol("t");
+static public Symbol T = Symbol.create(null, "t");
final static public DynamicVar OUT = new DynamicVar(new OutputStreamWriter(System.out));
final static Keyword TAG_KEY = new Keyword("clojure", "tag");
diff --git a/src/jvm/clojure/lang/ReaderLexer.java b/src/jvm/clojure/lang/ReaderLexer.java
index 172b370d..4a916507 100644
--- a/src/jvm/clojure/lang/ReaderLexer.java
+++ b/src/jvm/clojure/lang/ReaderLexer.java
@@ -1,4 +1,4 @@
-// $ANTLR 3.0 /Users/rich/dev/clojure/src/jvm/Reader.g 2007-07-20 09:22:37
+// $ANTLR 3.0 /Users/rich/dev/clojure/src/jvm/Reader.g 2007-08-02 16:47:44
/**
* Copyright (c) Rich Hickey. All rights reserved.
diff --git a/src/jvm/clojure/lang/ReaderParser.java b/src/jvm/clojure/lang/ReaderParser.java
index 5cfbbbb0..8f384451 100644
--- a/src/jvm/clojure/lang/ReaderParser.java
+++ b/src/jvm/clojure/lang/ReaderParser.java
@@ -1,4 +1,4 @@
-// $ANTLR 3.0 /Users/rich/dev/clojure/src/jvm/Reader.g 2007-07-20 09:22:37
+// $ANTLR 3.0 /Users/rich/dev/clojure/src/jvm/Reader.g 2007-08-02 16:47:44
package clojure.lang;
@@ -92,9 +92,9 @@ public String getGrammarFileName(){
// END HAND MODIFIED
*/
-final static Symbol DOTDOT = new Symbol("..");
-final static Symbol QUOTE = new Symbol("quote");
-final static Symbol META = new Symbol("meta");
+final static Symbol DOTDOT = Symbol.create(null, "..");
+final static Symbol QUOTE = Symbol.create(null, "quote");
+final static Symbol META = Symbol.create(null, "meta");
public static void main(String[] args) throws Exception{
Writer w = new PrintWriter(System.out);
@@ -1292,7 +1292,7 @@ public final Symbol symbol() throws RecognitionException{
if(failed) return val;
if(backtracking == 0)
{
- val = new Symbol(n.getText());
+ val = Symbol.intern(n.getText());
}
}
@@ -1305,7 +1305,7 @@ public final Symbol symbol() throws RecognitionException{
if(failed) return val;
if(backtracking == 0)
{
- val = new Symbol(n.getText());
+ val = Symbol.intern(n.getText());
}
}
@@ -1364,7 +1364,7 @@ public final Keyword keyword() throws RecognitionException{
if(failed) return val;
if(backtracking == 0)
{
- val = new Keyword(new Symbol(k.getText().substring(1)));
+ val = new Keyword(Symbol.intern(k.getText().substring(1)));
}
}
@@ -2133,7 +2133,7 @@ public final Object member() throws RecognitionException{
if(failed) return val;
if(backtracking == 0)
{
- val = new Symbol(i.getText());
+ val = Symbol.intern(i.getText());
}
}
@@ -2223,7 +2223,7 @@ public final Object method() throws RecognitionException{
if(failed) return val;
if(backtracking == 0)
{
- val = RT.cons(new Symbol(i.getText().substring(0, i.getText().length() - 1)), es);
+ val = RT.cons(Symbol.intern(i.getText().substring(0, i.getText().length() - 1)), es);
}
}
diff --git a/src/jvm/clojure/lang/Symbol.java b/src/jvm/clojure/lang/Symbol.java
index 4351f554..b825533e 100644
--- a/src/jvm/clojure/lang/Symbol.java
+++ b/src/jvm/clojure/lang/Symbol.java
@@ -17,6 +17,7 @@ public class Symbol extends Obj{
//these must be interned strings!
public final String ns;
public final String name;
+final int hash;
public String toString(){
if(ns != null)
@@ -24,39 +25,32 @@ public String toString(){
return name;
}
-public Symbol(String ns, String name){
- this.name = name.intern();
- if(ns != null)
- this.ns = ns.intern();
- else
- this.ns = null;
+static public Symbol intern(String ns, String name){
+ return new Symbol(ns == null ? null : ns.intern(), name.intern());
}
-public Symbol(String name){
- int i = name.indexOf('/');
+static public Symbol intern(String nsname){
+ int i = nsname.indexOf('/');
if(i == -1)
- {
- this.name = name.intern();
- this.ns = null;
- }
+ return new Symbol(null, nsname.intern());
else
- {
- this.ns = name.substring(0, i).intern();
- this.name = name.substring(i + 1).intern();
- }
+ return new Symbol(nsname.substring(0, i).intern(), nsname.substring(i + 1).intern());
}
+static public Symbol create(String ns_interned, String name_interned){
+ return new Symbol(ns_interned, name_interned);
+}
-private Symbol(IPersistentMap meta, String ns, String name){
- super(meta);
- this.name = name;
- this.ns = ns;
+private Symbol(String ns_interned, String name_interned){
+ this.name = name_interned;
+ this.ns = ns_interned;
+ this.hash = RT.hashCombine(name.hashCode(), RT.hash(ns));
}
public boolean equals(Object o){
if(this == o)
return true;
- if(o == null || !(o instanceof Symbol))
+ if(!(o instanceof Symbol))
return false;
Symbol symbol = (Symbol) o;
@@ -66,10 +60,17 @@ public boolean equals(Object o){
}
public int hashCode(){
- return RT.hashCombine(name.hashCode(), RT.hash(ns));
+ return hash;
}
public Obj withMeta(IPersistentMap meta){
return new Symbol(meta, ns, name);
}
+
+private Symbol(IPersistentMap meta, String ns, String name){
+ super(meta);
+ this.name = name;
+ this.ns = ns;
+ this.hash = RT.hashCombine(name.hashCode(), RT.hash(ns));
+}
}