Можно ли использовать:refer :all в ClojureScript:require ?

#clojure #clojurescript #cljx

#clojure #clojurescript #cljx

Вопрос:

Я просто пробую ClojureScript, начиная с преобразования того, что я написал в Clojure, в cljx.

Когда я пытаюсь его скомпилировать, я получаю:

 clojure.lang.ExceptionInfo: :refer must be followed by a sequence of symbols in :require 
 

Я нахожу несколько косвенных ссылок в Интернете, но нигде не указано, должен ли я иметь возможность использовать a :refer :all в программе ClojureScript.

Если я не могу этого сделать, в чем причина этого ограничения?

Ответ №1:

Нет, это намеренно невозможно. Недавно был разговор в списке рассылки ClojureScript, связанный с :refer :all , и похоже, что он никогда не будет поддерживаться.

Процитировать Дэвида Нолена из этой темы:

Это просто плохой стиль, и, насколько я знаю, единственная причина, по которой он не изменился в Clojure, заключается в том, что основная команда очень непреклонна в сохранении обратной совместимости, когда это возможно. Заметное отсутствие naked :use в ClojureScript было преднамеренным.

Комментарии:

1. Может кто-нибудь объяснить, почему это было бы плохим стилем? Предпочтительно ли иметь одно большое пространство имен вместо двух, даже если вы видите естественное разделение между функциями более низкого уровня и экспортируемыми функциями более высокого уровня?

2. Еще одна проблема с naked: use or refer :all заключается в том, что он вводит статическое разделение фаз. Если вы сделаете (ns my-ns (:require foo.bar refer :all)) это сейчас, а затем добавите foo.bar/baz позже, вы можете конфликтовать с базой данных, уже определенной в my-ns . Использование «all» означает, что вы должны иметь возможность перечислять закрытый список объявлений в пространстве имен или рисковать очень запутанным интерактивным и частичным поведением при перекомпиляции. Это особенно проблематично, если у вас есть макросы.

3. Это плохой стиль, потому что, когда вы пытаетесь прочитать и понять пространство имен, которое делает это, вы не можете сказать, откуда берутся функции. Это также затрудняет поиск и замену при рефакторинге, перемещении объектов и т. Д., Потому что у вас нет общего префикса ns для поиска.