Ассоциативное деструктурирование Clojure позволяет деструктурировать вектор (и, возможно, seq или список ) с помощью числового индекса.
Этот шаблон пока не упоминается на clojure.org, но - это , упомянутое в Радость Clojure , 2-е изд.Майкл Фогус, Крис Хаузер, май 2014, с.59. Там этот подход появляется в разделе «Ассоциативное деструктурирование» - ошибочно, поскольку эта основанная на индексах деструктуризация является лишь частным случаем «Ассоциативного деструктурирования», который в указанной книге называется «Деструктурирование с картой».1015 *
В любом случае, результаты неожиданные (Clojure 1.10.0):
Во всех случаях извлекайте значения по индексам 0 и 3.
Они работают, как и ожидалось:
(let [{firstthing 0, lastthing 3} [1 2 3 4]] [firstthing lastthing])
;=> [1 4]
(let [{firstthing 0, lastthing 3} (vec '(1 2 3 4))] [firstthing lastthing])
;=> [1 4]
Но в списке:
(let [{firstthing 0, lastthing 3} '(1 2 3 4)] [firstthing lastthing])
;=> [nil 4]
Почему там nil
в позиции 0?
Аналогично:
(let [{firstthing 0, lastthing 3} (seq '(1 2 3 4))] [firstthing lastthing])
;=> [nil 4]
Но наС другой стороны:
(let [{firstthing 0, lastthing 3} (vec (seq '(1 2 3 4)))] [firstthing lastthing])
;=> [1 4]
Что здесь происходит?
Приложение:
(let [{firstthing 0, lastthing 3} { 1 2 3 4 } ] [firstthing lastthing])
;=> [nil 4]
... звучит разумно, как картаразрушено ассоциативно на самом деле {1 2, 3 4}
.Таким образом, результат поиска не по позиции , а по целочисленной клавише (изменяя, так сказать, значение выражения под нашими ногами) будет в точности [nil 4]
.Что-нибудь, что не является вектором, выливаемым на карту первым?
(let [{firstthing 10, lastthing 30} (seq '(10 2 30 4))] [firstthing lastthing])
;=> [2 4]
Это, безусловно, выглядит так ...
(let [{firstthing 10, lastthing 30} (seq '(10 2 30 ))] [firstthing lastthing])
; Execution error (IllegalArgumentException) at user/eval367 (REPL:1).
; No value supplied for key: 30
О да.