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)
```

因此,第二种情况下没有必要进行绑定。
by
edited by
我认为我想的是

    (cond-> v pred identity)

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

    (cond-> v pred inc)

例如。但是 cond-> 也有同样的问题,不幸的是它无法将 v 线程到 pred 中。我一直希望有一个 cond-> 可以这样做,例如这个 https://juxt.pro/blog/posts/condas.html
by
...