как символы в предложении использования применяются в текущем пространстве имен - PullRequest
0 голосов
/ 07 февраля 2019

Я проверяю для core.match test

(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 ]

0 голосов
/ 07 февраля 2019

Выражение 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.

0 голосов
/ 07 февраля 2019

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

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

поведение шаблона изменяется на extend-type

...