Запечатанные протоколы 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, противоречит замыслу проекта и не выполняется. Тем не менее, вполне возможно лексически определить область действия протокола и предоставить набор типов или записей, реализующих протокол.

Другие вопросы по тегам