summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/clj/clojure/core.clj12
-rw-r--r--src/jvm/clojure/lang/Keyword.java12
2 files changed, 24 insertions, 0 deletions
diff --git a/src/clj/clojure/core.clj b/src/clj/clojure/core.clj
index 2c60e72e..3f0408af 100644
--- a/src/clj/clojure/core.clj
+++ b/src/clj/clojure/core.clj
@@ -554,6 +554,18 @@
(string? name) (clojure.lang.Keyword/intern ^String name)))
([ns name] (clojure.lang.Keyword/intern ns name)))
+(defn find-keyword
+ "Returns a Keyword with the given namespace and name if one already
+ exists. This function will not intern a new keyword. If the keyword
+ has not already been interned, it will return nil. Do not use :
+ in the keyword strings, it will be added automatically."
+ {:tag clojure.lang.Keyword}
+ ([name] (cond (keyword? name) name
+ (symbol? name) (clojure.lang.Keyword/find ^clojure.lang.Symbol name)
+ (string? name) (clojure.lang.Keyword/find ^String name)))
+ ([ns name] (clojure.lang.Keyword/find ns name)))
+
+
(defn spread
{:private true
:static true}
diff --git a/src/jvm/clojure/lang/Keyword.java b/src/jvm/clojure/lang/Keyword.java
index c20f1214..743a25f1 100644
--- a/src/jvm/clojure/lang/Keyword.java
+++ b/src/jvm/clojure/lang/Keyword.java
@@ -53,6 +53,18 @@ private Keyword(Symbol sym){
hash = sym.hashCode() + 0x9e3779b9;
}
+public static Keyword find(Symbol sym){
+ return table.get(sym).get();
+}
+
+public static Keyword find(String ns, String name){
+ return find(Symbol.intern(ns, name));
+}
+
+public static Keyword find(String nsname){
+ return find(Symbol.intern(nsname));
+}
+
public final int hashCode(){
return hash;
}