请分享您的想法!参加2024 Clojure 状态调查!

欢迎使用!请参阅关于页面以获取更多关于该功能的详细信息。

+10

提议

when-seqif-seq 作为 (when-let [x (seq ...)])(if-let [x (seq ...)]) 的简写。

这解决了什么问题?这只是处理要么返回空值要么返回空集合的函数的一个便利方式。

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,至少还需要再次调用seq。
0
by

你是否有关于此模式频率的数据?

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

我只找到vodori/missing库有这些功能。

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

但我没有找到任何使用这些功能的例子。
明天我将使用grasp进行更彻底的分析(这也可以匹配多行文本中的用法)。

我需要这个功能是因为我创建了一个返回序列的函数,但我还希望它可以用作谓词,而用户不必在when-let中对其进行序列化。如果上述宏存在于核心函数中,我就可以推荐使用它,而不必担心返回值。
我用这个脚本在我的本地.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-”前缀。但这样你将丢失6个节省的键盘按键中的4个,并且忘记了letfn的教训,而且会滑向带有“-seq”名称的另一个表单宇宙。  

接下来,“some-seq”,“remove-seq”,“take-while-seq”等,以类似的方式创建具有内嵌测试的seq。  

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