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

您是否有关于这个模式有多么普遍的频率数据?

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

我唯一找到包含这些功能的库是 vodori/missing。

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

但我没有找到任何使用这些功能的地方。
我会在明天使用 grasp 做一个更彻底的分析(这也可以匹配跨越多行的用法)。

我需要这个功能是因为我创建了一个返回序列的函数,但我还希望它可以作为谓词使用,而无需用户在 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与内嵌的测试一起组合。

在这所有的负面评论之后,我要说的是,如果有人想为我节省一些键位,我非常喜欢Java var-args互操作,这样我就不需要写出“maaaaakkkkeee aaaannnn arrraaaayyy ooffff ttthhiiiinnngggsss”。
by
名称遵循以前的命名方式 `if-some`。我们使用谓词 `seq` 而不是 `some?`。
为了遵循 `if-some` 的行为,绑定可能不应该包含 `seq`-ed 对象,而是原始对象。这也会保留类型信息,就像 @eval 建议的那样。
...