在Clojure Repl中重新编译函数会导致编译器警告

时间:2017-10-19 14:13:56

标签: clojurescript read-eval-print-loop figwheel

我似乎不了解REPL的一些重要方面,使用figwheellein-autoreload

如果我使用其中一个提到的插件启动REPL并对其中一个项目文件进行更改,我通常会收到编译器警告。通常,这意味着我必须重新启动REPL,这会破坏这些插件的整个目的。

让我举个例子。我有三个文件:core.cljsdemoscene.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. 你能告诉我,背景中发生了什么吗?了解这种情况我错过了什么?我该怎么做才能避免这些警告?

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

2 个答案:

答案 0 :(得分:4)

  

我没有编辑demoscene.cljs

我认为这可能会重新加载,因为您编辑的文件需要它:core.cljs

  

为什么cljs.core/update取代ns.demoscene/update

每当您定义与core命名空间函数同名的函数时,您都会看到此警告,因为默认情况下,您的命名空间中的core函数始终可用。警告告诉您,该命名空间中对update的任何调用cljs.core/update;它将是您在命名空间中定义的update函数。您可以明确exclude任何您想要的core功能,并且#34;遮蔽"在您的名称空间中(:refer-clojure :exclude [update])

答案 1 :(得分:3)

泰勒是正确的,但我想补充一点,在实践中,我发现影响核心功能是一个坏主意。当你出现这种情况时,往往会浪费大量的时间浪费:

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