2017-10-19 109 views
0

我似乎并不知道REPL的一些重要方面,使用figwheellein-autoreload在Clojure Repl中重新编译函数会导致编译器警告

如果我使用上述插件之一启动REPL并对其中一个项目文件进行更改,我通常会收到编译器警告。通常,这意味着我必须重新启动REPL,这会挫败这些插件的全部用途。

让我给你举个例子。我有三个文件:core.cljs,demoscene.cljsobjects.cljs。它们按我提到的顺序使用例如(:require [ns.demoscene :as demoscene])。我的主要功能位于core.cljs
我开始使用lein figwheel的花轮REPL,启动我的浏览器,一切正常。
如果我编辑objects.cljs功能并保存更改,我得到一个编译器警告:

Compile Warning src/cljs/ns/demoscene.cljs 
update already refers to: cljs.core/update being replaced by: ns.demoscene/update 

这是一个以上的水平非常奇怪:

  1. 我没有编辑demoscene.cljs
  2. cljs.core/update为什么要替换为ns.demoscene/update
  3. 如果我重新加载站点(我不重新启动figwheel会话),一切都很好。我的更改应用等。

您能告诉我,背景中发生了什么?我错过了解这种情况?我需要做些什么来避免这些警告?

如果您需要更多资源,请告诉我。

回答

4

我没有编辑demoscene.cljs

我想是因为它是由你做编辑的文件要求,这可能被重新加载:core.cljs

为什么要cljs.core/update通过ns.demoscene/update

替代你会看到这个警告,只要你定义同名core命名空间功能的功能,因为这些core功能都可以通过默认你的名字空间。警告告诉你在该命名空间中将调用update而不是cljs.core/update;它将是您在命名空间中定义的update函数。您可以明确exclude任何core函数,您想要在您的名称空间“遮蔽”,例如(:refer-clojure :exclude [update])

+0

另一件值得一提的是OP所看到的是警告而不是错误。尽管理解警告意味着什么非常重要,但值得强调的是,这是一个警告,而不是一个错误。正如你所指出的那样,警告是关于核心功能的重新定义,正如在另一个回应中指出的,除非你有真正的需要/理由这样做,否则通常不是一个好主意。 –

+0

谢谢你的回答。说实话,我不知道这样的核心功能是存在的,尽管现在我再次读到这个警告,这变得很清楚。我现在觉得很愚蠢...... – Joshua

3

泰勒是正确的,但我想补充一点,在实践中,我发现影子核心功能是一个坏主意。这往往导致的时间浪费公平一点,当你:

  1. 做到了这一点
  2. 忘了,你这样做(以后可能是一个小时,可能是几个月,甚至可能不是你)
  3. 尝试在文件的另一部分使用核心功能
+1

谢谢你的回答。我完全同意你的看法,那就是阴影是一种不好的做法。我相应地重新命名了函数。 – Joshua