2017-10-19 166 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