Clojure 如何在当前命名空间中应用use子句中的符号

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

我正在复习功课

当我在clojure.1.10中运行这些代码时,我想知道为什么

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