如果您从一个命名空间引用变量,然后您可以为该变量定义一个新值,这将修改另一个命名空间,并且在下面的示例中会像这样出现其他错误。
顺便说一下,Clojure不允许这样做,并且拒绝评估涉及引用变量的def,并发出类似于以下诊断错误的错误:
编译器异常:java.lang.IllegalStateException:foo已经引用:# '(some.name.space/foo)在命名空间:user,编译:(NO_SOURCE_PATH:2:1)
下面是一个完整示例,说明了问题
给定
`
(ns foo.core)
(defn square [x]
(* x x))
`
然后在REPL中这样做
`
cljs.user=> (require '[foo.core :refer [square]])
nil
cljs.user=> (var square)
'foo.core/square
cljs.user=> (square 3)
9
cljs.user=> (ns-interns 'cljs.user)
{}
cljs.user=> (defn square [x] (+ x x))
警告:square已经引用:foo.core/square正在替换为:cljs.user/square在第1行
'foo.core/square
cljs.user=> (square 3)
6
cljs.user=> (var square)
'foo.core/square
cljs.user=> (in-ns 'foo.core)
nil
foo.core=> (square 3)
6
foo.core=> (in-ns 'cljs.user)
nil
cljs.user=> (ns-interns 'cljs.user)
{square #'cljs.user/square}
cljs.user=> (cljs.user/square 3)
TypeError:无法读取未定义的属性'call'。
at repl:1:105
at repl:9:3
at repl:14:4
at Object.exports.runInThisContext (vm.js:54:17)
at Domain.<anonymous> ([stdin]:41:34)
at Domain.run (domain.js:221:14)
at Socket.<anonymous> ([stdin]:40:25)
at emitOne (events.js:77:13)
at Socket.emit (events.js:169:7)
at readableAddChunk (_stream_readable.js:146:16)
cljs.user=> #'cljs.user/square
'cljs.user/square
cljs.user=> @#'cljs.user/square
nil
`