diff options
author | Rich Hickey <richhickey@gmail.com> | 2007-08-02 20:51:38 +0000 |
---|---|---|
committer | Rich Hickey <richhickey@gmail.com> | 2007-08-02 20:51:38 +0000 |
commit | 04c59e81c4f16bfcaef2fdfd3f5bc5d887445045 (patch) | |
tree | 0d3056c6acc844f6015141e1d499d7c6538b527e /src | |
parent | 3fb1ffaceed047e58d219065deed567930ebeb15 (diff) |
Symbol changes
Diffstat (limited to 'src')
-rw-r--r-- | src/jvm/Reader.g | 16 | ||||
-rw-r--r-- | src/jvm/clojure/lang/Compiler.java | 36 | ||||
-rw-r--r-- | src/jvm/clojure/lang/DynamicVar.java | 8 | ||||
-rw-r--r-- | src/jvm/clojure/lang/Keyword.java | 2 | ||||
-rw-r--r-- | src/jvm/clojure/lang/LispReader.java | 10 | ||||
-rw-r--r-- | src/jvm/clojure/lang/RT.java | 2 | ||||
-rw-r--r-- | src/jvm/clojure/lang/ReaderLexer.java | 2 | ||||
-rw-r--r-- | src/jvm/clojure/lang/ReaderParser.java | 18 | ||||
-rw-r--r-- | src/jvm/clojure/lang/Symbol.java | 45 |
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)); +} } |