HTML Diff
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>тип -&gt; функция реализации</strong>, а при вызове метода протокола осуществляется поиск в этой таблице по типу 1-го аргумента с учетом иерархии. В результате декларация новой реализации для протокола будет сведена к обновлению глобальной таблицы.</p>
6 <p>Также есть возможность добавить реализацию протоколов к уже имеющимся типам, причем даже в том случае, если отсутствует доступ к исходным кодам. И не стоит думать, что тут происходит некая магия манипуляций с байткодом и другие подобные фокусы. Язык Clojure создает глобальную таблицу<strong>тип -&gt; функция реализации</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