Последовательности и коллекции Clojure

В Лиспе все структуры данных строятся из cons-ячеек, то есть они по сути являются связанными списками или двоичными деревьями или и тем, и другим (поправьте меня, если я ошибаюсь). Структуры данных Clojure - это списки, векторы, карты и наборы. Clojure включает две всеобъемлющие абстракции для этих структур данных: коллекции и последовательности. Абстракция Sequence определяет операции first, rest и cons, а абстракция collection определяет операции, специфичные для коллекции, такие как conj и into.

Основные функции Clojure, такие как map и filter, работают с абстракцией sequence, но принимают любую структуру данных и выполняют неявное преобразование. Эти функции тоже ленивы. Означает ли это, что по умолчанию Clojure хранит данные в более эффективных структурах данных, таких как индексированные массивы, и переключается на связанные списки только по мере необходимости? Как Clojure на самом деле преобразует коллекции в последовательности? Создается ли последовательность из коллекции с использованием итератора в потоковом режиме или в целом, а затем передается потребителю?


person Tuomas Toivonen    schedule 29.01.2019    source источник
comment
В Лиспе все структуры данных строятся из cons-ячеек - это распространенное заблуждение, но все шепелявые (за исключением некоторых игрушечных шепелявых) также имеют другие структуры данных.   -  person jkiiski    schedule 29.01.2019


Ответы (1)


Единственная структура данных в Clojure, которая представляет собой односвязный список, - это реальный list, например:

(list 1 2 3)

Все остальное - это эффективная структура данных (например, вектор, карта).

Ленивая последовательность (номинально) состоит из текущего значения и рецепта генерации следующего значения. После вычисления элементы кэшируются и не вычисляются повторно.

Преобразование коллекции в последовательность - это деталь реализации, которая обычно не важна для конечного пользователя.

Исходные функции map и filter ленивы, как и многие другие. Однако этого было достаточно головной боли (непредсказуемое время реализации), поэтому в язык были добавлены нетерпеливые / императивные версии mapv и filterv.

person Alan Thompson    schedule 30.01.2019
comment
clojure.lang.Cons, такой как cons created, представляет собой связанный список, например показывает исходный код. clojure.lang.persistentList - это другой связанный список: например, считается, а clojure.lang.Cons - нет. - person Thumbnail; 30.01.2019