gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 16:57:08 26 4
gpt4 key购买 nike

我正在审核 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 ,该行为当然会失败。

谢谢你的帮助。

最佳答案

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 .

关于clojure - 如何在当前命名空间中应用 use 子句中的符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54565904/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com