2014-02-07 35 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