diff options
-rw-r--r-- | src/clj/clojure/core.clj | 12 | ||||
-rw-r--r-- | src/jvm/clojure/lang/Keyword.java | 12 |
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; } |