2024年Clojure调查!分享您的想法。

欢迎!请参阅关于页面了解更多信息。

0投票
语法和读取器
编辑

目前,Clojure支持包含&rest参数的解构模式

user=> (let [[a b & c] (range 5)] [a b c])
[0 1 (2 3 4)]

Python同样支持,但还可以将所谓的通配符放在前端和中端位置(《PEP描述》)

>>> a, *b, c = range(5)
>>> a
0
>>> c
4
>>> b
[1, 2, 3]

为Clojure考虑过类似的功能吗?可能是这样的

user=> (let [[a & b c] (range 5)] [a b c])
[0 (1 2 3) 4]

我觉得这可能可以通过当前核心函数的解构来实现,但可能是我不知道一些细微之处。

1 答案

+1投票

选择
 
最佳答案

在什么场景下这会很有用?


重新展示
其他类型数组解构的相同或类似场景
* 我有一个数据范围的一系列项目,想要获得范围(例如最早的和最晚的)。我可以使用[f(s的第一个),l(s的最后一个),r((butlast s)的下一个)] 不用解构就可以做到这一点,但解构可以使它更优雅。
* 我有一个后进先出队列,并想要选择最后一个项目和第二个到最后一个的项目来处理:[[& init second-item first-item]]

在这些场景中的每一个,都完全有可能自己构建选择的项目,但使用Clojure的所有解构功能也可以做到这一点。使用解构语法是一种优雅且一致的实现方式,可以避免在let块中填写所有繁琐的工作。

除此之外,将其作为核心语法的一部分,它将能够嵌套使用,并且所有人都可以自动感受到性能的提升。
给定顺序性(可能未索引)的输入,这类用例通常效率不高。对于更广泛的使用场景,机制现在已在spec(通过s/conform和正则规范)中提供对其的支持。

在您提到的第二种情况下,我认为我们甚至不会想要支持或鼓励这种做法——这种做法只会导致性能混乱。

尽管我偶尔见过需要这种类型的东西,但它的需求远比现有支持的案例要少得多(并且在性能方面经常是不明智的),因此我不确定添加这一点是否有意义。
这是合理的,大致上也是我预想的结果。你愿意查看对`destructure`的补丁以及一些性能比较吗?
不太感兴趣,我认为你可能低估了在尾位置假定的剩余参数的数量以及实施这种更改所需的努力。此类更改与缺乏用例相结合,实在不值得花费时间。
太好了,非常感谢。
@Noah,这可以作为库中的一个宏来完成,几乎能带来相等的社会效益,而无需在修补clojure.core方面陷入复杂。
@pbwolf 我也这么想过。也许我会试试。

@alexmiller 仔细考虑后,我对你所说的许多地方假定剩余参数以及所需努力的陈述感到有些困惑。问题是人们依赖于Clojure读取器在剩余参数不在尾位置时抛出错误吗?
如上所述,spec 和 conform 已经可以处理这种情况,如果您需要的话。



;;=> [0 [1 2 3] 4]

...