Hi Timothy,

On Feb 2, 1:19 am, Timothy Pratley <timothyprat...@gmail.com> wrote:

> There are still some sharp edges I'm not sure about:
> (A) user=> (get-in {:a 1} [])
> {:a 1}
> ;; this is existing behavior, but I feel the result should be nil

+1 for nil

> (B) user=> (get-in {:a 1} nil)
> {:a 1}
> ;; this is existing behavior, but I feel the result should be nil (nil
> is a seq so not an exception)

+1 for nil

> (C) user=> (get-in {:a 1} 5)
> java.lang.IllegalArgumentException: Don't know how to create ISeq
> from: java.lang.Integer (NO_SOURCE_FILE:0)
> ;; existing behavior, seems sensible to throw an exception here rather
> than return nil

+1 for exception

> (D) user=> (get-in {nil {:a 1}} [] 2)
> {:a 1}
> ;; new behavior
> ;; using last/butlast only -> this is wrong... need to check the seq size
> ;; the solution depends upon what is correct for the preceding cases
> so need to establish those first
>
> Alternatively one could take the view that [] and nil are illegal key
> sequences, in which case should get-in enforce that (via preconditions
> or just a check) or should it just be added to the doc-string that
> using those values is undefined, or both?

I'm not sure about this too. I tend to an exception. (get m) will also
throw an exception...

> For reference here is a version that behaves most like existing get-in:
>
> (defn get-in
>   "Returns the value in a nested associative structure,
>   where ks is a sequence of keys. Returns nil if the key is not present,
>   or the not-found value if supplied."
>   ([m ks]
>    (reduce get m ks))
>   ([m ks not-found]
>    (if (empty? ks)
>      m
>      (if-let [l (reduce get m (butlast ks))]
>        (get l (last ks) not-found)
>        not-found))))

I would get rid of the if-let. Together with throwing an exception in
case of an empty key sequence we get:

(defn get-in
  "Returns the value in a nested associative structure,
  where ks is a sequence of keys. Returns nil if the key is not
present,
  or the not-found value if supplied."
  ([m ks] (get-in m ks nil))
  ([m ks not-found]
   (if-let [ks (seq ks)]
     (get (reduce get m (butlast ks)) (last ks) not-found)
     (throw (Exception. "key sequence must not be empty")))))

Sincerely
Meikel

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en

Reply via email to