summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2011-04-19 08:55:33 -0400
committerRich Hickey <richhickey@gmail.com>2011-04-19 08:55:33 -0400
commit8296b5f752fdb2926a309a7248d0d1bf6cb436b5 (patch)
tree8c3a2a8e0151adf8933f9a9a5fcd874ef98c197f
parentc5681382da775e898915b17f3ab18b49c65359ec (diff)
added support for ^:const defs
-rw-r--r--src/jvm/clojure/lang/Compiler.java23
-rw-r--r--src/jvm/clojure/lang/RT.java1
2 files changed, 13 insertions, 11 deletions
diff --git a/src/jvm/clojure/lang/Compiler.java b/src/jvm/clojure/lang/Compiler.java
index 04358382..d037186e 100644
--- a/src/jvm/clojure/lang/Compiler.java
+++ b/src/jvm/clojure/lang/Compiler.java
@@ -1724,17 +1724,16 @@ static class ConstantExpr extends LiteralExpr{
if(v == null)
return NIL_EXPR;
-// Class fclass = v.getClass();
-// if(fclass == Keyword.class)
-// return registerKeyword((Keyword) v);
-// else if(v instanceof Num)
-// return new NumExpr((Num) v);
-// else if(fclass == String.class)
-// return new StringExpr((String) v);
-// else if(fclass == Character.class)
-// return new CharExpr((Character) v);
-// else if(v instanceof IPersistentCollection && ((IPersistentCollection) v).count() == 0)
-// return new EmptyExpr(v);
+ else if(v == Boolean.TRUE)
+ return TRUE_EXPR;
+ else if(v == Boolean.FALSE)
+ return FALSE_EXPR;
+ if(v instanceof Number)
+ return NumberExpr.parse((Number)v);
+ else if(v instanceof String)
+ return new StringExpr((String) v);
+ else if(v instanceof IPersistentCollection && ((IPersistentCollection) v).count() == 0)
+ return new EmptyExpr(v);
else
return new ConstantExpr(v);
}
@@ -6492,6 +6491,8 @@ private static Expr analyzeSymbol(Symbol sym) {
Var v = (Var) o;
if(isMacro(v) != null)
throw Util.runtimeException("Can't take value of a macro: " + v);
+ if(RT.booleanCast(RT.get(v.meta(),RT.CONST_KEY)))
+ return analyze(C.EXPRESSION, RT.list(QUOTE, v.get()));
registerVar(v);
return new VarExpr(v, tag);
}
diff --git a/src/jvm/clojure/lang/RT.java b/src/jvm/clojure/lang/RT.java
index 65e2bbb3..c467d31e 100644
--- a/src/jvm/clojure/lang/RT.java
+++ b/src/jvm/clojure/lang/RT.java
@@ -179,6 +179,7 @@ final static public Var ERR =
Var.intern(CLOJURE_NS, Symbol.intern("*err*"),
new PrintWriter(new OutputStreamWriter(System.err), true)).setDynamic();
final static Keyword TAG_KEY = Keyword.intern(null, "tag");
+final static Keyword CONST_KEY = Keyword.intern(null, "const");
final static public Var AGENT = Var.intern(CLOJURE_NS, Symbol.intern("*agent*"), null).setDynamic();
final static public Var READEVAL = Var.intern(CLOJURE_NS, Symbol.intern("*read-eval*"), T).setDynamic();
final static public Var ASSERT = Var.intern(CLOJURE_NS, Symbol.intern("*assert*"), T).setDynamic();