2024 Clojure 状况调查! 中分享您的想法。

欢迎!有关该机制的更多信息,请参阅 关于 页面。

+10

提议

when-seqif-seq 添加为短语的 (when-let [x (seq ...)])(if-let [x (seq ...)])

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

2 个答案

+2
我喜欢它!不过,最好将其用作 `` 的简写吗?这样 x 仍然可以是字符串或向量。
我使用以下脚本来检查了我的本地 .m2:https://gist.github.com/borkdude/40a3670336a91fb4cdc3528c565b7241

我发现出现了1700次`(when-let [x (seq ...)] ...)`,而` (when-let [x (not-empty ...)] ...)`出现了166次。

然而,我们可以在调用seq之后将变量绑定到原始值上。但这会导致一个缺点,那就是如果你确实需要一个seq,就必须再次调用seq。
0 votes
by

你有关于这种模式频率的数据吗?

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

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 互操作项,这样我就不必写出“写tt,hyyy,e,r,r,e,e”尤她ieni ooff tt hh ew,hf, s,sssts,ts,s,s,rehearing”。
by
名称遵循了`if-some`之前的命名方式。我们使用谓词`seq`而不是`some?`。
为了遵循`if-some`的行为,绑定可能不应该包含`seq`化对象,而是原始对象。这也会保留像@eval建议的类型信息。
...