2024 Clojure 状态调查!中分享您的想法。

欢迎!请查看关于页面以了解更多关于该工作方式的信息。

0
ClojureScript

如果您从一个命名空间引用一个变量,那么您可以对该变量定义一个新的值,这将修改其他命名空间,并且正如以下示例所示,其他事情可能会出错。

顺带一提,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))
WARNING: 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
`

5 答案

0
_由mfikes发表的评论_

附加的补丁基本上将警告转换为非核心名称的错误,抛出与 Clojure 匹配的异常。

示例


$ script/noderepljs
ClojureScript Node.js REPL 服务器正在监听49203
要退出,请输入::cljs/quit
cljs.user=> (def map 3)
WARNING: map 已经引用:cljs.core/map 正被替换为:cljs.user/map 在行1 <cljs repl>
#'cljs.user/map
cljs.user=> (require '[clojure.set :refer [intersection]])
nil
cljs.user=> (def intersection 3)
clojure.lang.ExceptionInfo: 交集中已经引用: #'clojure.set/intersection 在 cljs.user 命名空间中第 1 行 <cljs repl> {:file "<cljs repl>", :line 1, :column 1, :root-source-info {:source-type :fragment, :source-form (def intersection 3)}, :tag :cljs/analysis-error}
    在 clojure.core$ex_info.invokeStatic(core.clj:4725)
    在 clojure.core$ex_info.invoke(core.clj:4725)
    在 cljs.analyzer$error.invokeStatic(analyzer.cljc:697)
...
0
by

评论者:mfikes

以下是一个示例,显示定义一个影射核心 Var 的 Var 是合法的

`
$ script/noderepljs
ClojureScript Node.js REPL 服务器正在监听 57077
要退出,请输入::cljs/quit
cljs.user=> (defn quot [s] (str "'" s "'"))
WARNING: quot 已经引用: cljs.core/quot 正在替换为: cljs.user/quot 在第 1 行

'cljs.user/quot

cljs.user=> (quot "hello")
"'hello'"
cljs.user=> (cljs.core/quot 6 2)
3
`

0
by

评论者:mfikes

CLJS-1558-2.patch rebaselines

0
by

评论者:mfikes

CLJS-1558-3.patch rebaselines

0
by
参考:[https://clojure.atlassian.net/browse/CLJS-1558](https://clojure.atlassian.net/browse/CLJS-1558)(由 mfikes 提供)
...