Reported by H.Duerer, Mar 13, 2009
max-key or min-key will evaluate (k value) multiple times for arguments if
more than 2 arguments are passed.
This is undesirable if k is expensive to calculate.
Something like the code below would avoid these double calculations (at the
price of generating more ephemeral garbage)
(defn max-key
"Returns the x for which (k x), a number, is greatest."
([k x] x)
([k x y] (if (> (k x) (k y)) x y))
([k x y & more]
(second (reduce (fn [x y] (if (> (first x) (first y)) x y))
(map #(vector (k %) %) (cons x (cons y more)))))))