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-”前缀。但那样的话,你就失去了4个6个节省的按键,忘记了letfn的课程,并走向了一个拥有“-seq”命名形式的另一种形式的宇宙。 

接下来,“some-seq”、“remove-seq”、“take-while-seq”等,同样可以与嵌入的测试一起组成序列。

在所有这些负面消息之后,我说说如果有人想为我节省一些按键,我将非常愿意有一个Java var-args互操作性,它不必让我写出“maaaakkkkeee aaannnn arrraaaayyy ooffff ttthhiiiinnngggsss”。
该名称遵循`if-some`之前的命名。我们使用谓词`seq`而不是`some?`。
为了遵循`if-some`的行为,绑定可能不应包含`seq`对象,而是原始对象。这也将保留类型信息,就像@eval建议的那样。
...