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 ...)] ...)`。

然而,我们只需在调用 seq 后将变量绑定回原始值。但这样做的不利之处是,如果你想确实得到一个序列,必须再次调用 seq。
0 votes
by

你有没有关于这种模式出现频率的频率数据?

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

by
我发现唯一包含这些的库是 vodori/missing

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

但我找不到任何使用它们的例子。
我可以用手柄明天进行更彻底的分析(这将匹配跨越多行的用法)。

我之所以需要这样做,是因为我创建了一个返回序列的函数,但我还希望它可以在没有用户需要在使用 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”等,将按类似方式将 seq 与它们的嵌入测试组合起来。

在我所有的负面评论之后,我将说,如果有人急于为我节省一些快捷键,我会乐于看到一个不让我写出“ lots off ”的 Java var-args 互操作。
命名遵循了之前的 `if-some` 命名方式。我们不使用 `some?`,而是使用谓词 `seq`。
为了使行为与 `if-some` 保持一致,绑定可能不应包含 `seq`-化对象,而应包含原始对象。这将也与 @eval 建议的类型信息保持一致。
...