我正在审核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
,则该行为当然会失败。
感谢您的帮助。
答案 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
通过use
或require
完成在库中加载所有表单的实际工作。
clojure.core/use
通常是较旧的形式。
它会自上而下地评估文件格式中的每个表达式,并默认使当前名称空间引用另一个名称空间中的所有符号,除非您使用:only
选项另行指定。
和clojure.core/require
是较新的形式。
它还从评估所有表达式开始,在它从顶部到底部引入的名称空间中,然后仅使当前名称空间引用您在:refer
参数中告知的特定符号。>
通常,与使用require
相比,新代码更倾向于使用use
。