2024 Clojure 状态调查!中分享你的想法。

欢迎!有关此功能的信息,请参阅关于页面。

+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-”前缀。但这样你会失去6个按键中的4个,并且忘记了letfn的经验,还可能滑向一个有“-seq”命名的替代形式的世界。

接下来,"some-seq"、"remove-seq"、"take-while-seq"等,以类似的方式将seq与它们的内嵌测试组合。

在这个消极之后,我会说我喜欢Java var-args互操作,它不需要我写出“maaaakkkkeee aaannnn arrraaaayyy ooffff ttthhiiiinnngggsss”。
by
名称遵循了`if-some`之前的命名。我们不使用`some?`,而是使用谓词`seq`。
为了遵循`if-some`的行为,绑定可能不应该包含`Seq`化的对象,而应该是原始对象。这也会保留类型信息,就像@eval建议的那样。
...