summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/clj/clojure/core.clj15
1 files changed, 11 insertions, 4 deletions
diff --git a/src/clj/clojure/core.clj b/src/clj/clojure/core.clj
index ca615435..017b0b70 100644
--- a/src/clj/clojure/core.clj
+++ b/src/clj/clojure/core.clj
@@ -4910,12 +4910,19 @@
"Returns the value in a nested associative structure,
where ks is a sequence of ke(ys. Returns nil if the key is not present,
or the not-found value if supplied."
+ {:added "1.2"}
([m ks]
- (reduce get m ks))
+ (reduce get m ks))
([m ks not-found]
- (if (seq ks)
- (get (reduce get m (butlast ks)) (last ks) not-found)
- m)))
+ (loop [sentinel (Object.)
+ m m
+ ks (seq ks)]
+ (if ks
+ (let [m (get m (first ks) sentinel)]
+ (if (identical? sentinel m)
+ not-found
+ (recur sentinel m (next ks))))
+ m))))
(defn assoc-in
"Associates a value in a nested associative structure, where ks is a