我今天发现了这个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
,但我想这样可以省去一些打字。
答案 0 :(得分:10)
不,你没有错过什么。这是一种正常的方式。 如果它只使用一次,我经常使用匿名函数。
(condp #(contains? %2 %1) some-set
"foo" "foo's in thar"
"bar" "bar's in thar"
"t'aint thar")
使用->
和->>
宏进行线程处理时,也会出现此问题。在这些情况下,我经常使用as->
宏为线程值赋予名称