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