В Clojure 1.4 что нужно использовать в ссылках?

Какое преимущество имеет использование :refer в :require с использованием :only в :use? Являются ли следующие синонимы?

(ns so.example (:use [my.lib :only [function]]))

и

(ns so.example (:require [my.lib :refer [function]]))

Ответ 1

Основная идея добавления :refer в :require состоит в том, чтобы полностью избавиться от :use, оставив только один оператор для загрузки других пакетов. Вы можете эмулировать существующие :use с помощью (:require [my.lib :refer :all])...

Ответ 2

да, они эквивалентны,

:refer и :require - это основные операции, необходимые для создания пространств имен. :use более убедительна

  • :require заставляет классы загружаться
  • :refer добавляет вещи в пространство имен, которое на самом деле представляет собой только карту (на самом деле пару карт).
  • :use - :refer + :require

насколько это может показаться, действительно нет волшебства для пространств имен

если вы создадите пространство имен, подобное этому

(ns so.example (:use my.lib))

эквивалент с: require должен быть:

(ns so.example (:require [my.lib :refer [function1 function2 function3 
                                         list every function in example 
                                         here and remember to keep it 
                                         up to date ]]))

Ответ 3

Начиная с версии 1.4.0, нет более веских оснований для использования. Используйте require: вместо этого используйте. Из списка изменений Clojure 1.4.0: "require теперь может принимать параметр: refer.: Refer принимает список символов для ссылки из пространства имен или: все, чтобы задействовать все общедоступные вары". (от https://8thlight.com/blog/colin-jones/2010/12/05/clojure-libs-and-namespaces-require-use-import-and-ns.html)