在 Clojure Repl 中重新编译函数会导致编译器警告
Recompiling functions in Clojure Repl cause compiler warning
我似乎不知道 REPL 的一些重要方面,使用 figwheel
或 lein-autoreload
。
如果我使用上述插件之一启动 REPL 并对其中一个项目文件进行更改,我通常会收到编译器警告。通常,这意味着我必须重新启动 REPL,这违背了这些插件的全部目的。
让我举个例子。我有三个文件:core.cljs
、demoscene.cljs
和 objects.cljs
。他们按照我提到他们的顺序互相引用,例如(:require [ns.demoscene :as demoscene])
。我的主要功能位于 core.cljs
.
我使用 lein figwheel
启动了一个 figwheel REPL,启动我的浏览器,一切正常。
如果我在 objects.cljs
中编辑函数并保存更改,我会收到编译器警告:
Compile Warning src/cljs/ns/demoscene.cljs
update already refers to: cljs.core/update being replaced by: ns.demoscene/update
这在不止一个层面上真的很奇怪:
- 我没有编辑
demoscene.cljs
- 为什么要把
cljs.core/update
换成ns.demoscene/update
- 如果我重新加载站点(我不重新启动 figwheel 会话),一切都会好起来的。我的更改已应用等
你能告诉我,后台发生了什么吗?我缺少什么来理解这种情况?我必须怎么做才能避免这些警告?
如果您需要更多资源,请告诉我。
I didn't edit demoscene.cljs
我认为这可能会重新加载,因为您编辑的文件需要它:core.cljs
。
Why should cljs.core/update
be replaced by ns.demoscene/update
只要您定义与 core
命名空间函数同名的函数,您就会看到此警告,因为默认情况下,这些 core
函数在您的命名空间中始终可用。该警告告诉您在该命名空间中对 update
的任何调用都将 而不是 为 cljs.core/update
;它将是您在命名空间中定义的 update
函数。您可以在您的命名空间中显式 exclude 任何 core
函数 "overshadow" ,例如(:refer-clojure :exclude [update])
Taylor 是正确的,但我想补充一点,在实践中,我发现隐藏核心功能不是一个好主意。当您:
时,它往往会导致浪费相当多的时间:
- 做到了
- 忘了你做了那个(可能是一个小时后,可能是几个月,甚至可能不是你)
- 试图在文件的另一部分使用核心功能
我似乎不知道 REPL 的一些重要方面,使用 figwheel
或 lein-autoreload
。
如果我使用上述插件之一启动 REPL 并对其中一个项目文件进行更改,我通常会收到编译器警告。通常,这意味着我必须重新启动 REPL,这违背了这些插件的全部目的。
让我举个例子。我有三个文件:core.cljs
、demoscene.cljs
和 objects.cljs
。他们按照我提到他们的顺序互相引用,例如(:require [ns.demoscene :as demoscene])
。我的主要功能位于 core.cljs
.
我使用 lein figwheel
启动了一个 figwheel REPL,启动我的浏览器,一切正常。
如果我在 objects.cljs
中编辑函数并保存更改,我会收到编译器警告:
Compile Warning src/cljs/ns/demoscene.cljs
update already refers to: cljs.core/update being replaced by: ns.demoscene/update
这在不止一个层面上真的很奇怪:
- 我没有编辑
demoscene.cljs
- 为什么要把
cljs.core/update
换成ns.demoscene/update
- 如果我重新加载站点(我不重新启动 figwheel 会话),一切都会好起来的。我的更改已应用等
你能告诉我,后台发生了什么吗?我缺少什么来理解这种情况?我必须怎么做才能避免这些警告?
如果您需要更多资源,请告诉我。
I didn't edit
demoscene.cljs
我认为这可能会重新加载,因为您编辑的文件需要它:core.cljs
。
Why should
cljs.core/update
be replaced byns.demoscene/update
只要您定义与 core
命名空间函数同名的函数,您就会看到此警告,因为默认情况下,这些 core
函数在您的命名空间中始终可用。该警告告诉您在该命名空间中对 update
的任何调用都将 而不是 为 cljs.core/update
;它将是您在命名空间中定义的 update
函数。您可以在您的命名空间中显式 exclude 任何 core
函数 "overshadow" ,例如(:refer-clojure :exclude [update])
Taylor 是正确的,但我想补充一点,在实践中,我发现隐藏核心功能不是一个好主意。当您:
时,它往往会导致浪费相当多的时间:- 做到了
- 忘了你做了那个(可能是一个小时后,可能是几个月,甚至可能不是你)
- 试图在文件的另一部分使用核心功能