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

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

这个想法是返回第一个匹配项下的字符串,其中some-set包含一个值。如果集合中都没有值,则返回最后一个值。问题是,contains?函数首先获取集合,然后 key ,而condp首先需要 key 。

我通过编写一个函数来“修复”它:
(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,但我认为这种方式可以节省一些输入时间。

最佳答案

不,您没有丢失任何东西。这是正常的解决方法。
如果只使用一次,我经常为此使用匿名函数。

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

当使用->->>宏对事物进行线程化时,也会出现此问题。在这种情况下,我经常使用as->宏为线程值命名

10-08 00:13