diff options
-rw-r--r-- | src/clj/clojure/core.clj | 15 |
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 |