#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 для поиска.