2024 Clojure 调查问卷! 中分享你的想法。

欢迎!请查看 关于 页面以获取更多关于如何使用此网站的信息。

+6
Clojure
编辑

我想知道为什么没有类似 not-empty 的函数,但对任何值和任何谓词来说都是这样

(defn when-pred [v pred] (when (pred v) v))

我发现这种模式非常普遍,但在核心库中缺失。

为什么在核心库中没有它呢?

JIRA: https://clojure.atlassian.net/projects/CLJ/issues/CLJ-2546

添加时间 08.09.2022

1-arity 对封装谓词非常有用

`
(defn when-pred [pred] (fn [v] (when (pred v) v)))

(keep (when-pred pos?) xs)
`

我目前发现的这个函数的最佳名称是 select

2 个答案

+1
by
selected by
 
最佳答案

我已经为这个问题添加了一个 jira(已添加到描述中)并对其进行了一些评论。

> c) 考虑参数顺序(`[v pred]` 可能是可行的,尤其是如果扩展到n个预测时)

在我的项目中,我使用“更自然的”顺序 `[pred v]`,但看起来 `[v pred]` 更符合“线程优先”的思维。
0

是否可以使用 cond->?或者可能是 when-let 吗?

> 是否可以使用 cond->?或者maybe when-let ?

不。或者请展示你的意思。

主要好处是当 `v` 是一个表达式,我们需要为它命名时

```
(let [v (get-v)] (when (pred v) v))
; 或者
(when-pred (get-v) pred)
```

因此在第二种情况下没有不必要的绑定。

编辑了
我认为我在想

    (cond-> v pred identity)

或者如果你知道接下来要对v做什么,你可以

    (cond-> v pred inc)

例如。但是 cond-> 也存在同样的问题,它不幸地没有将 v 线程化到 pred 中。我一直希望能有一个像这样的 cond->,例如 https://juxt.pro/blog/posts/condas.html
我们之所以有 condp-> 和 condp->->,正是出于这个原因: https://github.com/worldsingles/commons/blob/master/src/ws/clojure/extensions.clj#L7-L10
...