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

添加于2022年9月8日

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->存在同样的问题,不幸的是它没有在pred中将v线程化。我一直想要一个像这样的cond->,例如这个https://juxt.pro/blog/posts/condas.html
...