Clojure 2024 年调查 中分享您的看法!

欢迎!请在 关于 页面了解更多关于如何使用本站的信息。

+10

提案

when-seqif-seq 作为 (when-let [x (seq ...)])(if-let [x (seq ...)]) 的简写。

这是解决什么问题的?它只是处理那些可能返回 nil 或空集合的函数的便利方式。

2 答案

+2
我喜欢这个!但它不更好是作为`(when-let [x (not-empty ...)] x)`的简写吗?这样x仍然是例如字符串或向量。
by
我使用此脚本检查了我的本地 .m2: https://gist.github.com/borkdude/40a3670336a91fb4cdc3528c565b7241

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

然而,我们可以在调用seq之后只将该变量绑定到原始变量。但这样的话,如果你确实想要一个序列,则可能还需要再次调用seq。
0
by

你是否有关于这种模式频率的数据吗?

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

我找到的唯一包含这些内容的库是 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

只需使其可执行,然后从目录中运行。该脚本将递归地扫描 dir 中的 sources/jars。
我喜欢节省6个键位,在我看来,“fn”代替“function”或“lambda”完全值得这个票价,但我预见 if-seq/when-seq 会有一些成本。主要是有损 Clojure 的其他优点。

我喜欢 seq 是一个简单的习语,几乎出现在所有上下文中。
我喜欢在思考条件逻辑时不用担心复杂的转换。
我喜欢(即使只有一点错误)将序列库与应用程序语言区分开来。
我敬畏 Clojure 与真值之间的现有交换。

为了改进我关于重构的抱怨,“if-seq”可以称为“if-let-seq”,并且可以添加一个“let-seq”,这样添加/移除条件就只涉及“if-”或“when-”前缀。 但这样你会失去4个中6个节省的按键,忘记了letfn的教训,并且陷入了含有“-seq”命名形式的另一种形式的滑坡之中。 

接下来,"some-seq","remove-seq","take-while-seq"等,通过类似的组合将seq与它们的内嵌测试混合。

在所有这些负面评价之后,我要说的是,如果有人急于为我节省一些按键,我很乐意有一个Java var-args互操作性,这样我就不需要写出“maaaakkkkeee aaannnn arrraaaayyy ooffff ttthhiiiinnngggsss”。
by
名称遵循之前的“if-some”命名。我们使用谓词“seq”代替“some?”。
为了遵循“if-some”的行为,绑定可能不应包含“seq”的对象,而是原始对象。这也会保留类型信息,像@eval建议的那样。
...