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 进行更彻底的分析(这将匹配多行中的用法)。

我需要这个功能的原因是我创建了一个返回 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-”前缀。但这样你将失去4个节省的6个键位,并且忘记了letfn的教训,还有滑向一个包含“-seq”命名的形式异世界的风险。

接下来,“some-seq”、“remove-seq”、“take-while-seq”等,将以类似的方式组合seq和它们的嵌入测试。

在我所有的消极评论之后,我将说如果有人热衷于为我节省一些键位,我会很高兴有一个Java var-args互操作性,它不需要我写“maaaaakkkkeeaaaannnnarrrraaaaaayyyyy ooffff ttthhiiiinnngggsss”。
 avatar by
名称遵循了`if-some`的先前命名。我们使用谓词`seq`而不是`some?`。
为了遵循`if-some`的行为,绑定可能不应该包含`seq`对象,而是原始对象。这也会保留类型信息,就像@eval建议的那样。
...