The same or similar scenarios that other sequence destructuring is used:
* I have a sequence of items with some range of data, and I want the bounds (earliest and latest, for example). I could achieve this without any destructuring with [f (first s), l (last s), r (next (butlast s))], but destructuring makes it nicer.
* I have a LIFO queue, and want to select the last item and second to last items to process next: [[& init second-item first-item]]
In each of these scenarios, it’s possible to construct the selected items myself, but that’s also possible with all of Clojure’s destructuring. Using the destructuring syntax is a nice and consistent way to achieve this without filling a let block with all of the busywork.
Alongside that point, by making it a part of the core syntax, it will be usable nested and any performance improvements will be felt by everyone automatically.