Clojure 如何在当前命名空间中应用use子句中的符号
我正在复习功课 当我在clojure.1.10中运行这些代码时,我想知道为什么Clojure 如何在当前命名空间中应用use子句中的符号,clojure,namespaces,Clojure,Namespaces,我正在复习功课 当我在clojure.1.10中运行这些代码时,我想知道为什么 (:use clojure.core.match.regex) 工作?我可以理解正在使用match,如果我不包括regex,行为当然会失败 感谢您的帮助。当clojure使用一个命名空间时,它将执行其中的每一条语句。所以在这个正则表达式文件中 (extend-type Pattern mp/ISyntaxTag (syntax-tag [_] ::m/regex)) 模式行为由扩展类型改变,当clojur
(:use clojure.core.match.regex)
工作?我可以理解正在使用match
,如果我不包括regex
,行为当然会失败
感谢您的帮助。当clojure
使用一个命名空间时,它将执行其中的每一条语句。所以在这个正则表达式文件中
(extend-type Pattern
mp/ISyntaxTag
(syntax-tag [_] ::m/regex))
模式行为由扩展类型改变,当clojure使用命名空间时,它将执行其中的每个语句。所以在这个正则表达式文件中
(extend-type Pattern
mp/ISyntaxTag
(syntax-tag [_] ::m/regex))
模式行为由extend type
更改。命名空间顶部的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
是较新的形式。
它还从计算它所拉入的名称空间中的所有表达式开始,从上到下,然后只使当前名称空间引用您在:refere
参数中告诉它的特定符号
一般来说,新代码倾向于使用require
而不是使用use
命名空间顶部的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
是较新的形式。
它还从计算它所拉入的名称空间中的所有表达式开始,从上到下,然后只使当前名称空间引用您在:refere
参数中告诉它的特定符号
一般来说,新代码倾向于使用require
而不是use