2013-04-26 76 views
3

假设我有以下Clojure的函数调用:Clojure - 语法糖将映射条目自动转换为函数参数?

(def mymap {:a1 1 :a2 2}) 

(defn my-adder [input-map] 
    (let [a1 (:a1 input-map) 
      a2 (:a2 input-map)] 
     (+ a1 a2))) 

(my-adder mymap) 

我正在寻找的是一些方法,使我的加法器功能简单,通过转换地图自动PARAMS - 是这样的:

(defn my-adder [(magic-function input-map)] 
    (+ a1 a2)) 

有人能指点我失踪的事吗?

回答

5

我认为你正在寻找解构。以下是您可以执行的操作:

(def mymap {:a1 1 :a2 2}) 

(defn my-adder [{:keys [a1 a2]}] 
     (+ a1 a2)) 

(my-adder mymap) 

You can learn more about it here

+0

:keys!那就是我正在寻找的东西。 – hawkeye 2013-04-26 07:52:37

+0

np,请注意有很多不同的方法可以解构事物。 – 2013-04-26 16:45:18

+0

你可以扩展一下吗? – hawkeye 2013-04-28 12:11:39

2

使用可以使用像波纹管。它被称为Clojure:解构。你可以找到更多的here

(defn my-adder [{a1 :a1 a2 :a2}] 
     (+ a1 a2)) 
1

除了展示解构的答案,你也可以使用applyvals如果只是简单地从地图上添加所有值加在一起是对你罚款:

(defn my-adder [m] 
    (apply + (vals m)))