2011-09-08 23 views
3

我有一個Clojure函數,參數爲:[{:keys [from to]}]fromto鍵都是可選的。我想將這些密鑰重新映射到新密鑰中,但保留這些值。什麼是有效/慣用的方式去做這件事?這是我的解決方案。如何處理函數參數中可選鍵的重新映射

(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} 

回答

1

有這個在clojure.set命名空間稱爲rename-keys功能:

user=> (use 'clojure.set) 
nil 
user=> (rename-keys {:from 10} {:from :$gte :to :$lt}) 
{:$gte 10} 
1

你可以用解構這個:

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

我會建議this用大量的實例很好的介紹。

+0

我編輯我的問題澄清,回報不應該爲零。謝謝! –

+0

對於你想要完成的事情,真的很難理解。 你說:「我需要它返回一個或兩個,如果其中一個鍵沒有輸入,則不爲零」,但這正是簡單的「(defn fun [point] point)」所做的。例如。 「(fun {:x 10:y 20})=> {:x 10 y:20}」,(fun {:x 10})=> {:x 10}「。 – dnaumenko

+0

選擇在運行時 –