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”取代“函数”或“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 ttthhhee tttthhiiiinnngggsss”。
名称遵循了`if-some`先前的命名惯例。我们使用谓词`seq`而不是`some?`。
为了遵循`if-some`的行为,绑定可能不应包含`seq`对象,而应该是原始对象。这也将保留类似于@eval建议的类型信息。
...