为什么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)不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

let 内的 Clojure 循环(全局 v 局部变量)

varletconst的区别,已经作用范围。

JavaScript:了解 for 循环内的 let 范围 [重复]

整个类范围内的 C++ 命名空间别名

let和var,const的区别(非原创/自己整理成了适合自己看的样子)

Javascript:如何清除非全局(封闭)setTimeout?