Clojure:反转包含的参数?用于condp

时间:2015-01-16 00:52:10

标签: clojure

我今天发现了这个clojure问题:

(condp contains? some-set
   "foo"   "foo's in thar"
   "bar"   "bar's in thar"
   "t'aint thar")

我们的想法是在some-set包含值的第一个匹配项下返回字符串。如果集合中没有值,则返回最后一个值。问题是,contains?函数先收集集合,然后是密钥,condp首先需要密钥。

我通过写一个函数来“修复”它:

(defn reverse-params [f] (fn [a b] (f b a))

并用来代替它:

(condp (reverse-params contains?) some-set
   "foo"   "foo's in thar"
   "bar"   "bar's in thar"
   "t'aint thar")

哪个有效,但我的问题是我错过了一些更好的方法(可能使用some)?我可以使用cond,但我想这样可以省去一些打字。

1 个答案:

答案 0 :(得分:10)

不,你没有错过什么。这是一种正常的方式。 如果它只使用一次,我经常使用匿名函数。

(condp #(contains? %2 %1) some-set
   "foo"   "foo's in thar"
   "bar"   "bar's in thar"
   "t'aint thar")

使用->->>宏进行线程处理时,也会出现此问题。在这些情况下,我经常使用as->宏为线程值赋予名称