как символы в пункте использования применяются в текущем пространстве имен

Вопрос задан: 8 месяцев назад Последняя активность: 8 месяцев назад
up 1 down

Я обзор для core.match тест

(ns clojure.core.match.test.regex
  (:use [clojure.core.match :only [match]])
  (:use clojure.core.match.regex)
  (:use clojure.test))

(deftest basic-regex
     (is (= (match ["asdf"]
                   [#"asdf"] 1
                   :else 2)
            1)))

Когда я запустил эту коду в clojure.1.10, но интересно, почему, как

 (:use clojure.core.match.regex)

работает ? я могу понять match используется, если я не включаю regex, То поведение будет не в состоянии, конечно.

Спасибо за вашу помощь.

2 ответа

up 0 down accepted

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.

up 0 down

Когда Clojure use пространство имен, он будет выполнять каждое утверждение в нем. так что в этом файле регулярных выражений

(extend-type Pattern
  mp/ISyntaxTag
 (syntax-tag [_] ::m/regex))

поведение Узор изменяется extend-type