Иммутабельность в Clojure
В языке программирования Clojure все структуры данных являются иммутабельными. Рассмотрим, как это работает.
На практике у нас отсутствует способ, к примеру, изменить элемент вектора. Все, что нам доступно — это создание нового вектора, у которого изменен один элемент. При этом важно отметить, что язык Clojure практически сохраняет алгоритмическую сложность для всех стандартных операций над коллекциями, делая это как по времени, так и по памяти.
Достигается такая сложность за счет применения персистентных коллекций. В чем здесь заключается идея? В том, что в случае «изменения» структуры старая и новая версии разделяют бóльшую часть внутренних данных. Мало того, старая версия полностью сохраняет свою работоспособность, а мы имеем доступ ко всем существующим версиям структуры, что немаловажно. Ну и, конечно же, ненужные версии соберет сборщик мусора.
Непосредственно из коробки язык программирования Clojure поддерживает:
- односвязные списки,
- хеш-таблицы,
- векторы,
- красно-черные деревья.
Также реализована персистентная очередь (для стека возможно применение списка либо вектора). Как бы там ни было, всё иммутабельно. Также стоит добавить, что в целях повышения производительности есть возможность создавать собственные типы-записи.
Здесь мы всего лишь объявляем структуру с тремя полями. При этом компилятор создаст объект с пятью полями (двумя «лишними»). Также одно поле для метаданных (это null в нашем случае) и три поля для, собственно, данных. Кроме того, еще одно поле будет для дополнительных ключей. И даже если для увеличения скорости в программе мы объявим структуру с явным перечислением полей, язык программирования Clojure все равно оставит возможность по добавлению дополнительных значений.
Остается добавить, что для структур данных в языке Clojure предусмотрен специальный синтаксис:
Хотите знать больше? Добро пожаловать на специализированный курс "Closure Developer" в Otus!
По материалам https://habr.com/ru/post/173071/.