Действительно ли 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] в большинстве случаев должны рассматриваться как частные и могут быть изменены без предварительного уведомления. Там даже есть серые зоны.

В общем, мы не придаем большого значения инкапсуляции или скрытию внутренних элементов. В большинстве случаев внутренние компоненты остаются доступными, если они могут быть полезны продвинутому пользователю, делающему интересные вещи, с оговоркой о том, что более странные вещи вы делаете, тем более вероятно, что вы будете случайно сломаны в будущем выпуске.

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