2017-10-19 13 views
0

figwheelまたはlein-autoreloadを使用して、REPLの重要な側面を認識していないようです。Clojureで関数を再コンパイルするとコンパイルの警告が発生する

上記のいずれかのプラグインを使用してREPLを起動し、プロジェクトファイルの1つで変更を行うと、通常はコンパイラの警告が表示されます。しばしば、これはREPLを再起動しなければならないことを意味します.REPLはこれらのプラグインの目的を全て破ります。

例を挙げておきます。私は3つのファイル:core.cljs,demoscene.cljsobjects.cljsを持っています。彼らは私がそれらを挙げた順にお互いを参照します。 (:require [ns.demoscene :as demoscene])。私の主な機能はcore.cljsです。
lein figwheelを使用してfigwheel REPLを起動し、ブラウザを起動すると、すべて正常に動作します。

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

これは、複数のレベルで本当に奇妙ですが:

  1. 私はdemoscene.cljs
  2. を編集していなかった私は objects.cljsで関数を編集し、変更内容を保存した場合
    は、私は、コンパイラの警告が表示されます
  3. なぜcljs.core/updatens.demoscene/update
  4. に置き換えられますか(私はfigwheelセッションを再開しません)、すべてが正常です。変更が適用されます。

バックグラウンドで何が起こっているのか教えてもらえますか?私はこの状況を理解するために何が欠けていますか?私はこれらの警告を避けるために何をしなければならないのですか?

これ以上のリソースが必要な場合は教えてください。

答えて

4

私は、私はそれはあなたが編集をしたファイルに必要ですので、これがリロードされるかもしれないと思うdemoscene.cljs

を編集しませんでした:core.cljs。これらcoreの機能は、デフォルトで常に利用可能であるため、

はなぜcljs.core/update、あなたはcore名前空間の関数と同じ名前の関数を定義するたびにこの警告が表示されますns.demoscene/update

に置き換える必要がありますあなたの名前空間。その警告は、その名前空間のupdateへの呼び出しがではないことを伝えています。cljs.core/updateです。名前空間に定義した関数updateになります。たとえば、excludecore関数をネームスペースに「隠したい」と明示的に指定することができます。 (:refer-clojure :exclude [update])

+0

言い換えれば、OPが見ているのは警告とエラーです。警告の意味を理解することは重要ですが、警告でもエラーでもないことを強調することも重要です。ご指摘のとおり、この警告は、コア機能の再定義についてのものであり、他の回答で指摘されているように、一般的には良いアイデアではありません。 –

+0

ありがとうございます。正直言って、私はそのような核心機能が存在するかどうかはわかりませんでしたが、警告をもう一度読んだので明らかになりました。私は今、とても馬鹿だと感じています... – Joshua

3

テイラーは正解ですが、実際にはコア機能をシャドーするのは悪い考えです。

  • これを行っ

    1. はあなたがいること(時間後、数ヶ月かもしれないかもしれない、でもあなたではないかもしれない)ということを忘れていました:それはあなたがきたときに無駄な時間の公平なビットにつながる傾向があります
    2. ファイルの別の部分でcore関数を使用しようとしました
  • +1

    あなたの答えをありがとう。私はあなたに完全に同意します、その陰影は悪い習慣です。私は関数に応じて名前を変更しました。 – Joshua

    関連する問題