Я часто оказываюсь в ситуации, когда мне действительно все равно, есть ли у меня вектор или карта:
[:foo :bar :baz :qux]
{0 :foo, 1 :bar, 2 :baz, 3 :qux}
Важные функции (get
, assoc
и т.д.) работают на обоих. Некоторые, например, dissoc
, не работают на векторах, но у них есть веские причины не делать этого.
Однако я просто не понимаю, почему keys
и vals
работают на картах, а не на векторах. Есть ли веская причина, почему они не реализованы что-то вроде этого (или, может быть, с более элегантным, полиморфным решением)?
(defn keys [m]
(if (vector? m)
(seq (range (count m)))
(clojure.lang.RT/keys m)))
(defn vals [m]
(if (vector? m)
(seq m)
(clojure.lang.RT/vals m)))
Если нет веской причины, как я могу попытаться реализовать это в стандартном Clojure?