2024 年 Clojure 状态调查!中分享您的想法。

欢迎!有关如何使用本页面的更多信息,请参阅关于页面。

+10 投票

提案

when-seqif-seq 添加简写,分别对应于 (when-let [x (seq ...)])(if-let [x (seq ...)])

这个问题解决了什么问题?这只是处理那些要么返回 nil,要么返回空集合的函数的一种便利方式。

2 个回答

+2 投票
我喜欢它!不过,是否更好让它成为 `(when-let [x (not-empty ...)] x)` 的简写?这样 x 仍然可以是字符串或向量。
我使用此脚本检查了我的本地 .m2:https://gist.github.com/borkdude/40a3670336a91fb4cdc3528c565b7241

我发现1700次 `(when-let [x (seq ...)] ...)` 与 166次 ` (when-let [x (not-empty ...)] ...)`。

然而,我们可以在 original 上调用 seq 之后只绑定变量。但这样做会有缺点,即在您真正需要序列时需要再次调用 seq。
0 投票

您有关于这种模式频率的数据吗?

这些函数在其他实用库中存在吗?如果是,它们被使用了吗?

作者
我找到的唯一一个含有这些功能的库是vodori/missing。

https://github.com/vodori/missing/blob/develop/src/missing/core.clj#L159

但我在其中未找到任何使用。
作者
我可以用grasp(它也可以匹配跨越多行的使用)来做一个更彻底的分析。

我需要这个功能的原因是创建了一个返回seq的函数,但我还希望它可以用作谓词,用户不需要在when-let中调用seq。如果上述宏在核心中存在,我就可以推荐使用它,不必担心返回值。
作者
使用这个脚本在我的本地.m2中发现了大约1700个实例

https://gist.github.com/borkdude/40a3670336a91fb4cdc3528c565b7241

只需使其可执行,并在目录中运行。该脚本将递归地扫描sources/jars。
作者
我喜欢省去6个按键,在我看来,“fn”取代“function”或“lambda”完全值得入场费,但我预见if-seq/when-seq会带来一些成本。主要是侵蚀Clojure的其它优点。

我喜欢seq是一种简单惯用法,在所有上下文中都存在。
我喜欢不需要担心复杂转换就可以思考条件逻辑。
我喜欢这种外观(即使它略微夸张),即序列库与语言区分开来。
我对Clojure与真值逻辑的现有关系感到敬畏。

为了改善我对重构的抱怨,可以将"if-seq"称为"if-let-seq",并添加一个"let-seq",这样添加/删除条件就只需涉及"if-"或"when-"前缀。但那样你将损失6个按键中的4个,同时忘记了letfn的教训,并滑向了一个带有"-seq"名称的备选形式宇宙。

接下来,"some-seq","remove-seq","take-while-seq"等,将与它们内嵌的测试类似地组成序列。

在所有这些负面评论之后,我想说我将很高兴看到一个Java var-args互操作,它不会让我写出"maaaakkkkeee aaannnn arrraaaayyy ooffff ttthhiiiinnngggsss"。
by
该名称遵循"if-some"的先前命名。我们使用谓词"seq",而不是"some?"。
为了遵循"if-some"的行为,绑定可能不应包含已"seq"化的对象,而是原始对象。这也会像@eval建议的那样保留类型信息。
...