如何处理函数参数中可选键的重新映射

问题描述:

我有一个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} 

有这个在clojure.set命名空间称为rename-keys功能:

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

你可以用解构这个:

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

选择在运行时 –