为什么ns非全局范围内的别名(let,def)不起作用?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么ns非全局范围内的别名(let,def)不起作用?相关的知识,希望对你有一定的参考价值。
尝试在内部使用别名,以便能够在本地使用它,但在尝试使用别名时遇到错误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
答案
(别名......)不一定是顶级。 clojure的工作方式是有一种称为读取器的东西,它接受文本数据并将其转换为数据结构,这些数据结构是编译器的输入。看到
https://clojure.org/reference/reader
在使用之前,必须已经为读者定义了代码中引用的任何名称空间。 (类似于功能)。
所以,在
(let []
(alias 'sss 'clojure.string)
(println (sss/capitalize "aaa")))
当读者试图转向时,尚未分配别名
(sss/capitalize)
进入数据。
以上是关于为什么ns非全局范围内的别名(let,def)不起作用?的主要内容,如果未能解决你的问题,请参考以下文章
JavaScript:了解 for 循环内的 let 范围 [重复]