Строго говоря, (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