0 added
0 removed
Original
2026-01-01
Modified
2026-03-10
1
<p>Теги: clojure, иммутабельность</p>
1
<p>Теги: clojure, иммутабельность</p>
2
<p>Чтобы создать полиморфные функции, в языке программирования Clojure предусмотрено два механизма. Поначалу язык поддерживал лишь мультиметоды - безусловно, средство мощное, однако на практике часто избыточное. Но уже начиная с версии 1.2, была добавлена новая концепция -<strong>протоколы</strong>. О них и поговорим.</p>
2
<p>Чтобы создать полиморфные функции, в языке программирования Clojure предусмотрено два механизма. Поначалу язык поддерживал лишь мультиметоды - безусловно, средство мощное, однако на практике часто избыточное. Но уже начиная с версии 1.2, была добавлена новая концепция -<strong>протоколы</strong>. О них и поговорим.</p>
3
<p>Протоколы напоминают Java-интерфейсы, однако они не способны друг друга наследовать. При этом в каждом протоколе описывается набор функций.</p>
3
<p>Протоколы напоминают Java-интерфейсы, однако они не способны друг друга наследовать. При этом в каждом протоколе описывается набор функций.</p>
4
<p>Таким образом мы объявляем 2 сущности - сам<strong>протокол</strong>, плюс<strong>функцию</strong>show -- обычную Clojure-функцию, которая при вызове подыскивает самую подходящую реализацию на основании типа 1-го аргумента. При этом важно отметить, что отдельно объявляются необходимые структуры данных и указывается реализация протокола для них.</p>
4
<p>Таким образом мы объявляем 2 сущности - сам<strong>протокол</strong>, плюс<strong>функцию</strong>show -- обычную Clojure-функцию, которая при вызове подыскивает самую подходящую реализацию на основании типа 1-го аргумента. При этом важно отметить, что отдельно объявляются необходимые структуры данных и указывается реализация протокола для них.</p>
5
<p>На практике есть возможность реализации протокола для стороннего типа (включая встроенный).</p>
5
<p>На практике есть возможность реализации протокола для стороннего типа (включая встроенный).</p>
6
<p>Также есть возможность добавить реализацию протоколов к уже имеющимся типам, причем даже в том случае, если отсутствует доступ к исходным кодам. И не стоит думать, что тут происходит некая магия манипуляций с байткодом и другие подобные фокусы. Язык Clojure создает глобальную таблицу<strong>тип -> функция реализации</strong>, а при вызове метода протокола осуществляется поиск в этой таблице по типу 1-го аргумента с учетом иерархии. В результате декларация новой реализации для протокола будет сведена к обновлению глобальной таблицы.</p>
6
<p>Также есть возможность добавить реализацию протоколов к уже имеющимся типам, причем даже в том случае, если отсутствует доступ к исходным кодам. И не стоит думать, что тут происходит некая магия манипуляций с байткодом и другие подобные фокусы. Язык Clojure создает глобальную таблицу<strong>тип -> функция реализации</strong>, а при вызове метода протокола осуществляется поиск в этой таблице по типу 1-го аргумента с учетом иерархии. В результате декларация новой реализации для протокола будет сведена к обновлению глобальной таблицы.</p>
7
<p>Хотите знать больше? Добро пожаловать на<a>специализированный курс "Closure Developer"</a>в Otus!</p>
7
<p>Хотите знать больше? Добро пожаловать на<a>специализированный курс "Closure Developer"</a>в Otus!</p>
8
<p><em>По материалам https://habr.com/ru/post/173071/.</em></p>
8
<p><em>По материалам https://habr.com/ru/post/173071/.</em></p>
9
9