Действительно ли clojure.lang - просто детали реализации?
В Clojure некоторые задачи (например, создание PersistentQueue
или используя deftype
реализовать пользовательский тип данных, который совместим с clojure.core
функции) требуют знания классов и / или интерфейсов в clojure.lang
,
Однако согласно clojure.lang/package.html
:
Единственный класс, который считается частью общедоступного API,
clojure.lang.IFn
, Все остальные классы должны рассматриваться как детали реализации.
Являются ли эти заявления неправильными или устаревшими? Если да, то есть ли планы исправить их в будущем? Если нет, есть ли более предпочтительный способ выполнения задач, упомянутых выше, или они просто не должны выполняться вообще в идиоматическом коде Clojure?
1 ответ
Алекс Миллер прокомментировал это в прошлом (хотя всю ветку стоит прочитать):
Я бы сказал, что у Clojure есть ряд "публичных" вещей.
- Новый API Clojure (clojure.java.api.Clojure) является официальным публичным API для внешних абонентов Clojure. Этот API в основном состоит из способов разрешения переменных и вызова функций.
- Для пользователей Clojure в Clojure практически любой открытый вариант, имеющий строку документации и отображаемую в документации API, можно считать общедоступным API.
- Закрытые переменные, которые являются частными или не имеют строки документации (например, переменная не указана в общедоступных API-документах), являются вероятными местами для очень осторожного перехода.
- Внутренние Java-интерфейсы Clojure [
clojure.lang
], безусловно, предназначены для того, чтобы позволить создателям библиотек создавать полезные вещи, которые играют в мире Clojure. Я не знаю, что кто-либо когда-либо говорил, что они "публичные", но я, конечно, думаю, что любое изменение основного интерфейса, которое может нарушить работу внешних пользователей, будет рассматриваться очень тщательно.- Внутренние классы Java Clojure [
clojure.lang
] в большинстве случаев должны рассматриваться как частные и могут быть изменены без предварительного уведомления. Там даже есть серые зоны.В общем, мы не придаем большого значения инкапсуляции или скрытию внутренних элементов. В большинстве случаев внутренние компоненты остаются доступными, если они могут быть полезны продвинутому пользователю, делающему интересные вещи, с оговоркой о том, что более странные вещи вы делаете, тем более вероятно, что вы будете случайно сломаны в будущем выпуске.