如何将use子句中的符号应用于当前名称空间

时间:2019-02-07 03:34:16

标签: clojure namespaces

我正在审核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 :(得分:0)

当Clojure use一个命名空间时,它将执行其中的每个语句。所以在那个正则表达式文件中

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

模式行为由extend-type

更改

答案 1 :(得分:0)

名称空间顶部的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

通过userequire完成在库中加载所有表单的实际工作。

clojure.core/use通常是较旧的形式。 它会自上而下地评估文件格式中的每个表达式,并默认使当前名称空间引用另一个名称空间中的所有符号,除非您使用:only选项另行指定。

clojure.core/require是较新的形式。 它还从评估所有表达式开始,在它从顶部到底部引入的名称空间中,然后仅使当前名称空间引用您在:refer参数中告知的特定符号。

通常,与使用require相比,新代码更倾向于使用use