Можно ли отбросить последний элемент из набора в Clojure? - PullRequest
0 голосов
/ 10 марта 2020
(defn dropit
  [input]                         ;Assume input is '(This is (my input (and you (are awesome))))

  (drop-last input)              ;returns -> (This is)

  )

В приведенной выше функции drop-last не делает то, что вы предполагали бы. Есть ли способ удалить только последний элемент из ввода, поэтому возвращаемое значение: (Это (мой ввод (и вы))

Есть ли простая функция для этого написать?

1 Ответ

1 голос
/ 11 марта 2020

Наборы не имеют гарантии заказа в clojure, если вы не используете sorted-set, поэтому могут быть неожиданные результаты при использовании drop-last на наборе. Если у вас есть отсортированный набор, вы можете добавить его последним идемпотентно.

Тем не менее, пример данных в комментариях вашего кода вообще не является набором, это список, и вывод, который вы видите, учитывая Ваш ввод ожидается, так как в этом списке есть три элемента, последний из которых является самим списком со своими собственными элементами:

first => "This"
second => "is"
last => ("my" "input" ("and" "you" ("are" "awesome")))

Удаление последнего здесь должно дать (This is), что вы и указали происходящее.

Если вы хотите удалить внутренний список '("are" "awesome"), вы можете следовать некоторым советам по прохождению, данным вам в комментариях. Кроме того, если вы не против сделать свой ввод векторным, вы можете выполнить с ним несколько ассоциативных операций, снимая с бедра, например:

(assoc 
  input 
  (- (count input) 1)
  (->> input
    (take-last 1)
    first
    (drop-last 1)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...