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 调用它。如果上述宏存在于核心中,我就可以推荐使用它而不用担心我的返回值。
  作者是
我用这个脚本来查找本地 .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”等,以类似的方式组合seq及其嵌入的测试。

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