Запечатанные протоколы Clojure
Я хотел бы знать, использует ли Clojure шаблон запечатанного интерфейса/реализации записи в Java, и если да, то как его определить.
Я думал в духе чего-то вроде:
(defprotocol
;; protocol definition here
:allows
;; vector of allowed types)
Тогда REPL должен предупредить вас о том, что необходимо определить определенные типы.
Java-способ сделать это состоял бы в том, чтобы определить интерфейс, который разрешает только определенные классы, и таким образом компилятор заставляет эти классы реализовывать интерфейс и категорически запрещает любому другому классу реализовывать интерфейс.
Я думаю, что это, вероятно, гораздо более правдоподобно в статическом языке, тогда как в динамическом языке это может вызвать интересные сложности.
РЕДАКТИРОВАТЬ
Было бы яснее увидеть в контексте https://www.infoq.com/articles/data-dependent-programming-java/ , чтобы понять, что я ищу.
По сути, я думаю, что мой вопрос можно было бы лучше сформулировать так: «Как реализовать контролируемый специальный полиморфизм в Clojure», в смысле контролируемого значения только определенные типы могут расширять протокол. Тогда это потенциально может принести преимущества, указанные в ссылке.
Тем не менее, возможно, в этом заключается фундаментальное различие между динамическим и статическим программированием. Поэтому, пожалуйста, найдите время, чтобы подтвердить или исправить мои предположения, и простите меня, если я задаю неуместный вопрос.
1 ответ
После небольшого исследования кажется, что протоколы НЕ предназначены именно для этого. Протоколы предназначены для решения проблемы выражения и поэтому должны быть полностью неограниченными.
Однако Clojure — это TC, поэтому с помощью карты и частного протокола можно определить набор функций, которые создают записи и типы, использующие протокол и только предоставленный набор типов.
Если для пояснения требуется код, запросите его в комментарии или напишите свою собственную реализацию.
Вывод: запечатывание протоколов, как это делается в Java, противоречит замыслу проекта и не выполняется. Тем не менее, вполне возможно лексически определить область действия протокола и предоставить набор типов или записей, реализующих протокол.