请在 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
作者

你有没有关于这种模式频繁度的数据?

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

by
唯一我发现具有这些功能的库是 vodori/missing

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

但是我没有找到任何使用这些的地方。
by
我明天可以用 grasp 做更深入的分析(它也会匹配跨多行的用法)。

我需要这个功能是因为我创建了一个返回 seq 的函数,但我想它也可以作为一个谓词使用,而无需用户在 when-let 中调用 seq。如果在核心中存在以上宏,我就可以推荐使用它,而不用担心我的返回值。
by
我用这个脚本在我的本地 .m2 中找到了大约 1700 个出现

https://gist.github.com/borkdude/40a3670336a91fb4cdc3528c565b7241

只需要使其可执行,然后在目录中运行。该脚本将递归地扫描 sources/jars。
by
我喜欢节省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 ttthhhee tttthhiiiinnngggsss"。
by
名称遵循之前的"if-some"命名方式。我们使用谓词"seq"而不是"some?"。
为了跟随"if-some"的行为,绑定可能不应该包含"seq"化的对象,而应该包含原始对象。这也将保留类型信息,就像@eval所建议的那样。
...