【发布时间】:2018-03-04 14:38:54
【问题描述】:
尝试在 let 中为 ns 设置别名以便能够在本地使用它,但在尝试使用别名时出现错误 CompilerException java.lang.RuntimeException: No such namespace: sss
(ns core
(:require [clojure.set]
[clojure.string])
)
(let []
(alias 'sss 'clojure.string)
(println (ns-aliases *ns*) "hi1")
(println (sss/capitalize "hONdURas"))
;(println (clojure.string/capitalize "hONdURas")) ;;this works
(ns-unalias *ns* 'sss)
(+ 1 2)
)
(println (ns-aliases *ns*))
https://repl.it/repls/NoxiousRubberyComputationallinguistics
【问题讨论】:
-
不特定于
let。(def testd (do (alias 'sss 'clojure.string) (sss/trim "")))和((fn [] (alias 'sss 'clojure.string) (sss/trim "")))是一样的。看起来alias必须是顶级的。 -
很遗憾 :( 我希望在每次选择时使用类似于 SQL-way 的别名,我可以为非常不同的表使用相同的别名,因为它们对于每个查询都是本地的
-
同样奇怪的是,只是把
(alias 'sss 'clojure.string)放入不会导致任何错误 -
有趣的是,别名 是 注册:
(let [] (alias 'b 'clojure.string) (println "NS:" (ns-aliases *ns*)))输出NS: {b #object[clojure.lang.Namespace 0x66bd2083 clojure.string]}。但是,如果您尝试 使用 别名,则整个事情都会在println甚至可以运行之前因编译器异常而失败。这几乎看起来像一个错误。 -
@Carcigenicate
(let [] ...)并不总是与(do ...)相同。在文件的顶层,(do ...)中的每个子表达式都是单独编译和执行的。相反,(let [] ...)遵循通常的求值规则,在求值之前一次编译整个表达式(包括所有子表达式)。如果您要更改环境,例如通过添加命名空间别名,这可能会有所不同。
标签: clojure namespaces