Clojure последовательности и коллекции - PullRequest
0 голосов
/ 29 января 2019

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

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

1 Ответ

0 голосов
/ 30 января 2019

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

(list 1 2 3)

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

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

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

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

...