Выражение ns
в верхней части пространства имен - это макрос, который расширяется до некоторого кода, который обеспечивает оценку всех форм в требуемых библиотеках, а затем заставляет некоторые символы в текущем пространстве имен ссылаться на функции и тому подобное избиблиотеки.
(macroexpand-1
`(ns clojure.core.match.test.regex
(:use [clojure.core.match :only [match]])
(:use clojure.core.match.regex)
(:use clojure.test))))
(do
;; Create the namespace and then switch the compilers context to it,
;; so things defined when evaluating this file will happen to this namespacee
(clojure.core/in-ns 'clojure.core.match.test.regex)
;; For every namespace required, or referred, evaluate every form in them
;; including any `ns` forms which will in turn do that for other namespaces.
(clojure.core/with-loading-context
(clojure.core/refer 'clojure.core)
(clojure.core/use '[clojure.core.match :only [user/match]])
(clojure.core/use 'clojure.core.match.regex)
(clojure.core/use 'clojure.test))
;; do some additional housekeeping etc.
(if
(.equals 'clojure.core.match.test.regex 'clojure.core)
nil
(do
(clojure.core/dosync
(clojure.core/commute
@#'clojure.core/*loaded-libs*
clojure.core/conj
'clojure.core.match.test.regex))
nil)))
nil
Фактическая работа по загрузке всех форм в библиотеке выполняется с помощью use
или require
.
clojure.core/use
, обычно это более старая форма,Он оценивает каждое выражение в форме файла сверху вниз и заставляет текущее пространство имен ссылаться на все символы в другом пространстве имен по умолчанию, если только вы не укажете это с помощью опции :only
.
и clojure.core/require
- более новая форма.Он также начинается с оценки всех выражений в пространстве имен, которое он вытягивает, сверху вниз, а затем только в текущем пространстве имен ссылается на конкретные символы, которые вы ему сообщаете в параметре :refer
.
В целом новый код предпочитает require
вместо use
.