Я пытаюсь найти идиоматический способ Clojure для «сжатия» вектора:
(shift-nils-left [:a :b :c :a nil :d nil])
;=> (true [nil nil :a :b :c :a :d])
(shift-nils-left [nil :a])
;=> (false [nil :a])
(shift-nils-left [:a nil])
;=> (true [nil :a])
(shift-nils-left [:a :b])
;=> (false [:a :b])
Другими словами, я хочу переместить все значения nil
в левый конец вектора без изменения длины. Логическое значение указывает, произошло ли какое-либо смещение. «Внешняя» структура может быть любой seq
, но внутренним результатом должен быть вектор.
Я подозреваю, что функция будет включать filter
(для значений nil) и into
для добавления к вектору nil
s той же длины, что и оригинал, но я не уверен, как уменьшить результат возвращается к исходной длине. Я знаю, как справиться с этой «длинной рукой», но подозреваю, что Clojure сможет сделать это в одну строку.
Я играю за идею написать игрока Bejeweled в качестве упражнения для изучения Clojure.
Спасибо.