2014-02-07 66 views
2

我猜測有一個簡單的方法來做到這一點,我沒有找到。我想將一個映射傳遞給一個方法,該方法將命名值綁定到鍵,例如Clojure映射到命名鍵的語法

(DEFN我的法[& {:鍵[ABC]}] ...

這個工作,如果調用如

(MY-方法:1: b 2:C 3)

但我想用提供的地圖,如東西,看起來像

叫它

(DEF米{:1:B 2:C 3})

(MY-方法米)

有一個簡單的方法到地圖變換到所需的參數列表?

回答

4

剛落符號:

> (defn my-method [{:keys [a b c]}] (+ a b c)) 
> (my-method m) 
6 
+1

問的問題「給出的方法這個形狀,我怎麼稱呼它?「。這個答案的形式是:「改變方法」,所以我不認爲這是一個好的答案。但也許這不是一個好問題。 :) –

+0

啊,我讀它是在調用他寫的一種方法。如果不能改變方法,我認爲沒有比你的答案更好的解決方案。 –

5

這是不漂亮,但:

(apply my-method (mapcat identity m)) 

或在評論中建議:

(apply my-method (apply concat m)) 
+2

'mapcat身份證'很奇怪。有時我寫'mapcat seq'是因爲它最短,但'apply concat'是一種傳統的方式。 – amalloy

+1

我想我多年前從別人那裏看到'mapcat身份證明'(也許是因爲我會責怪所有的人都很聰明)並且卡住了。同意'應用concat'似乎是一種更好的意圖表示。 –

+0

我發現定義:'(defn apply-map [f&args](apply f(concat(butlast args)(apply concat(last args)))))'' – opqdonut