Как обрабатывать переопределение дополнительных клавиш в параметре функции - PullRequest
3 голосов
/ 08 сентября 2011

У меня есть функция Clojure с параметром: [{:keys [from to]}]. Клавиши from и to являются необязательными. Я хотел бы переназначить эти ключи в новые ключи, но сохраняя значения. Какой эффективный / идиоматический способ сделать это? Вот мое текущее решение.

(defn query
  [{:keys [from to]}]
  (let [re-map  {:$gte from
                 :$lt  to}]
    (into {} (remove #(nil? (val %)) re-map))))

Мне нужно вернуть один или оба, и не ноль, если один из ключей не был введен. Итак

=>(query {:from 10}) 
{:$gte 10} 

и

=>(query {:from 10 :to 20})
{:$gte 10 :lt 20}

Ответы [ 2 ]

2 голосов
/ 08 сентября 2011

Для этого в пространстве имен clojure.set есть функция с именем rename-keys:

user=> (use 'clojure.set)
nil
user=> (rename-keys {:from 10} {:from :$gte :to :$lt})
{:$gte 10}
1 голос
/ 08 сентября 2011

Вы можете использовать деструктуризацию для этого:

user=> (defn re-map [{the-x :x the-y :y}] the-x)
user=> (re-map {:x 10 :y 1})  
10

Я бы порекомендовал это отличное введение с множеством примеров.

...