Есть ли способ вернуть последний элемент набора в Clojure? - PullRequest
0 голосов
/ 10 марта 2020
user-> (last '(First (Second (Last))))
-> (Second (Last))

Обычно я предполагаю, что это ^ вернется просто (Last). Почему это? И есть ли способ вернуть только (последний) или последний.

А как же для:

(defn function
 [input]              ;assume input = '(First (Second (Last)))

 (last input)

 )

1 Ответ

6 голосов
/ 10 марта 2020

Строго говоря, (First (Second (Last))) - это не набор, а список. Набор - это набор элементов без дубликатов и упорядочение элементов не требуется.

Если присмотреться, это список из 2 элементов. Первым элементом является символ First, а вторым элементом является сам список: (Second (Last))

Одна из основополагающих идей Clojure - абстракция sequence : множественные типы данных коллекции позволит вам взять один элемент за раз. Вы можете вызвать функцию seq в коллекциях, таких как HashMaps, Sets, Vectors и Lists.

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

Для вложенных структур данных вы можете использовать tree-seq, который будет перебирать ваш вложенный список по одному элементу за раз, переходя во вложенные коллекции, где это необходимо. tree-seq принимает 2 или 3 аргумента: необязательная функция для определения того, является ли элемент ветвью (например, содержит ли другие элементы), функция для получения дочерних элементов ветви и обход коллекции.


(tree-seq sequential? identity '(First (Second (Last))))

;; Note: Commas added for clarity
;; => ((First (Second (Last))), First, (Second (Last)), Second, (Last), Last)

Из этого вы можете явно извлечь последний элемент с помощью last:

(last (tree-seq sequential? identity '(First (Second (Last)))))
;; => Last
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...