Open lassemaatta opened 7 months ago
here are some relevant threads on clojurian slack highlighting the confusion:
https://clojurians.slack.com/archives/C03S1KBA2/p1668533720466509
https://clojurians.slack.com/archives/C03S1KBA2/p1707982404402549
https://clojurians.slack.com/archives/C03S1KBA2/p1714580544135239
https://clojurians.slack.com/archives/C03S1KBA2/p1715935559111129
I just tripped over this issue today too.
i thought it's a bug, but @puredanger said it's intended behaviour: https://ask.clojure.org/index.php/12374/map-destructuring-works-on-singleton-lists?show=12380#c12380
so the Destructuring in Clojure
guide should definitely mention these peculiarities!
it provides this example:
(defn configure [val & {:keys [debug verbose]
:or {debug false, verbose false}}]
(println "val =" val " debug =" debug " verbose =" verbose))
so it should mention how it behaves the same way, as a function defined as:
(defn configure [val {:keys [debug verbose]
:or {debug false, verbose false}}]
(println "val =" val " debug =" debug " verbose =" verbose))
when called as (configure 12 (list :debug true))
or (configure 12 (list {:debug true}))
,
but not equivalent, when called as (configure 12 (vector :debug true))
or (configure 12 (vector {:debug true}))
.
im not sure what reasoning can be given for this behaviour though...
Since clojure 1.11 (as per CLJ-2603), destructuring a sequence containing a single map can directly bind to the map contents. An example of this can be seen here. It might be a good idea to mention this in the destructuring guide as this behaviour might be surprising to some (at least it was for me).