请在《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

选择
 
最佳答案

我已经为这个问题添加了一个 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
...