请分享您的看法在 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

单参数是一样有用的,用于包裹谓词

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

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

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

2 个回答

+1

选择
 
最佳答案

我为这个问题添加了 jira(已在描述中添加)并在那里写了一些评论。

> c) 考虑参数顺序(`[v pred]`可能适用,特别是扩展到n个预测时)

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

cond->能符合要求吗?或者可能是when-let?

> cond->能符合要求吗?或者可能是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
by
...