В Clojure некоторые задачи (например, создание экземпляра PersistentQueue
или использование deftype
для реализации пользовательского типа данных, совместимого с функциями clojure.core
) требуют знания классов и/или интерфейсов в clojure.lang
.Действительно ли clojure.lang действительно детали реализации?
Однако, по словам clojure.lang/package.html
:
Единственный класс рассматривается как часть общественного API является
clojure.lang.IFn
. Все остальные классы должны рассматриваться как детали реализации.
Являются ли эти утверждения неправильными или устаревшими? Если да, планируют ли они исправить их в будущем? Если нет, есть ли более предпочтительный способ выполнения упомянутых выше задач, или они просто не будут выполняться вообще в идиоматическом коде Clojure?
Просто потому, что члены 'clojure.lang' считаются деталями реализации, это не значит, что вам не разрешено ссылаться на них. Скорее, это просто означает, что вы не должны ожидать, что такой код будет переносимым (например, вам может понадобиться отдельный код для Clojure vs ClojureScript). – DaoWen
@DaoWen 'clojure.lang', считающийся деталью реализации, означает больше, чем просто не переносимый код. В строгом смысле этого слова деталь реализации может быть изменена в любое время, пока общественные интерфейсы остаются неизменными. Однако clojure.lang не совсем такой боевик. –