为什么ns非全局范围内的别名(let,def)不起作用?

时间:2018-03-04 14:38:55

标签: clojure namespaces

尝试在内部使用别名,以便能够在本地使用它,但在尝试使用别名时出现错误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

1 个答案:

答案 0 :(得分:1)

(别名......)不一定是顶级。 clojure的工作方式是有一种称为 reader 的东西,它接受文本数据并将其转换为数据结构,这些数据结构是编译器的输入。参见

https://clojure.org/reference/reader

在使用之前,必须已经为读者定义了代码中引用的任何名称空间。 (类似于功能)。

所以,在

(let [] 
    (alias 'sss 'clojure.string)
    (println (sss/capitalize "aaa")))

当读者试图转

时,尚未指定别名
(sss/capitalize)

进入数据。