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(已在描述中),并有一些评论。

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

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

可以是`cond->`吗?或者可能是`when-let`?

by
> 可以是`cond->`吗?或者可能是`when-let`?

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

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

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

因此第二种情况下没有不必要的绑定。
by
修改 by
我认为我在想

    (cond-> v pred identity)

如果您知道对v想要做的下一步操作,可以选择

    (cond-> v pred inc)

例如。但是cond->不幸的是有同样的问题,它没有将v注入pred。我一直希望有一个可以实现这一点的cond->,如下所示 https://juxt.pro/blog/posts/condas.html
我们为 condp-》 和 condp-》》 设计了这种用法:[查看GitHub链接](https://github.com/worldsingles/commons/blob/master/src/ws/clojure/extensions.clj#L7-L10)
...