2

私は今日、Clojure を使って最初の一歩を踏み出しましたが、すぐに最初の紛らわしい障害に遭遇しました!

新しい Leiningen(2.5.1) プロジェクトをビルドしましたが、次のデフォルト コードを実行したいだけです。

(ns wavescript.core
  (:gen-class))

(defn -main
  "I don't do a whole lot ... yet."
  [& args]
  (println "Hello, World!"))

問題は、Lighttable(0.7.2) コンソールに次のように表示されることです。

警告: unsigned-bit-shift-right はすでに名前空間 cljs.core の #'clojure.core/unsigned-bit-shift-right を参照しており、次のように置き換えられています: #'cljs.core/unsigned-bit-shift-right

Google のエントリがいくつか見つかりましたが、それ以上の情報はありませんでした。これは何についてですか?

4

1 に答える 1

5

これは、シンボル unsigned-bit-shift-right が clojure.core 名前空間と cljs.core で見つかったために発生します。clojure.core 名前空間は cljs.core の前にコンパイル/ロードされ、新しいシンボルの導入により警告がスローされます。名前空間から、あなたはclojurescriptを書いているようです。このファイルcljs.coreの 2147 行を見ると、次の形式が表示されます。

(defn unsigned-bit-shift-right
  "Bitwise shift right with zero fill"
  [x n] (cljs.core/unsigned-bit-shift-right x n))

cljs.core 名前空間で。どうやら、lighttable は clojure.core と clj.core の両方をインポートしています。

正直なところ、完全に自己参照型であるため、cljs の実装がどのように機能しているかさえわかりません。さらに、451 行目から unsigned-bit-shift-right が使用されていますが、これはプレフィックスが付いていないため、clojure.core 実装を使用している必要があります。奇妙な。上記のフォームは、以前のすべての使用後に表示されます。シンボルを安全に除外できると言っても過言ではありません。実際、これはパッチに値するかもしれません...

これを解決するには、名前空間のインポートを明示的に記述し、そのインポートを除外することをお勧めします。refer関数はそれを可能にします。

したがって、次のような名前空間があります

(ns my.namespace.hello-world
  [:require 
    [cljs.core :exclude [unsigned-bit-shift-right]]])

clojure.core の実装は次のようになります。

(defn unsigned-bit-shift-right
  "Bitwise shift right, without sign-extension."
  {:inline (fn [x n] `(. clojure.lang.Numbers (unsignedShiftRight ~x ~n)))
   :added "1.6"}
  [x n] (. clojure.lang.Numbers unsignedShiftRight x n))

あるいは、機能をラップしているため、おそらく cljs.core は clojure.core を公開する必要がないように設計されています。その場合は、clojure.core を除外して、コードが正しく機能するかどうかを確認してください。

実際、cljs.core 名前空間を見ると、次のようになります。

(ns cljs.core
  (:refer-clojure :exclude [-> ->> .. amap and areduce alength aclone assert binding bound-fn case comment cond condp
                            declare definline definterface defmethod defmulti defn defn- defonce
                            defprotocol defrecord defstruct deftype delay destructure doseq dosync dotimes doto
                            extend-protocol extend-type fn for future gen-class gen-interface
                            if-let if-not import io! lazy-cat lazy-seq let letfn locking loop
                            memfn ns or proxy proxy-super pvalues refer-clojure reify sync time
                            when when-first when-let when-not while with-bindings with-in-str
                            with-loading-context with-local-vars with-open with-out-str with-precision with-redefs
                            satisfies? identical? true? false? number? nil? instance? symbol? keyword? string? str get
                            make-array vector list hash-map array-map hash-set

                            aget aset
                            + - * / < <= > >= == zero? pos? neg? inc dec max min mod
                            byte char short int long float double
                            unchecked-byte unchecked-char unchecked-short unchecked-int
                            unchecked-long unchecked-float unchecked-double
                            unchecked-add unchecked-add-int unchecked-dec unchecked-dec-int
                            unchecked-divide unchecked-divide-int unchecked-inc unchecked-inc-int
                            unchecked-multiply unchecked-multiply-int unchecked-negate unchecked-negate-int
                            unchecked-subtract unchecked-subtract-int unchecked-remainder-int
                            unsigned-bit-shift-right

                            bit-and bit-and-not bit-clear bit-flip bit-not bit-or bit-set
                            bit-test bit-shift-left bit-shift-right bit-xor

                            cond-> cond->> as-> some-> some->>

                            if-some when-some test ns-interns var vswap!])

unsigned-bit-shift-right が名前空間から除外されていることがわかります。したがって、この問題を解決するには、clojure.core を除外する必要があります。

于 2015-02-13T18:40:14.767 に答える