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