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

一元 arities 对包装谓词很有用

`
(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]` 对“线程优先”更友好。

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
正因为如此,我们才有 condp- 和 condp-->,详见:https://github.com/worldsingles/commons/blob/master/src/ws/clojure/extensions.clj#L7-L10
...