2014-03-30 41 views
0

我希望能夠通過哈希映射將命名參數傳遞給函數。假設我有這樣的功能:使用哈希映射中的命名參數調用Clojure函數

(defn foo [a & {:keys [b]}] (println a b)) 

我希望能夠使用來自地圖的參數調用它。我知道我可以這樣做:

(apply foo 1 (mapcat identity {:b 2})) 

但一定有一個更習慣和不笨笨的方式來做到這一點,對嗎?

回答

1

沒有,沒有。但是你可以通過mapcat使用concat,而不是直接做的:

(apply foo 1 (apply concat {:b 2})) 

您也可以使用->>宏這樣可以很清楚(雖然不是短):

(->> {:b 2} 
    (apply concat) 
    (apply foo 1)) 
+0

我喜歡應用'concat',謝謝。使用線程操作符實際上使其不太清楚,至少對我而言。 :) –

1

不,沒有其他更笨拙的方法。這將是更好地使你的foo採取散列映射爲參數和模式匹配於它的鍵:

(defn foo [a {:keys [b]}] (println a b)) 
(foo 1 {:b 2}) 
+0

'(富1:B 2) '比'(foo 1 {:b 2})'更習慣於使用,至少從我讀過的Clojure代碼來看。 –