Консоль Clojure выдает предупреждение "unsigned-bit-shift-right" на простом HelloWorld

Я делаю свои первые шаги с 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 уже ссылается на: #'clojure.core/unsigned-bit-shift-right в пространстве имен: cljs.core, заменяется на: #'cljs.core/unsigned-bit-shift-right

Я нашел несколько записей Google, но ни одна не привела меня дальше. О чем это?

1 ответ

Решение

Это вызвано тем, что символ 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, поскольку она полностью самоссылочная. Кроме того, существует использование unsigned-bit-shift-right, начиная со строки 451, которые не имеют префикса, поэтому они должны использовать реализацию clojure.core. Bizarre. Вышеуказанная форма появляется после всех предыдущих использований. Можно с уверенностью сказать, что символ можно безопасно исключить. На самом деле, это может заслуживать патча...

Чтобы решить эту проблему, вы можете попытаться явно указать ваши импорты пространства имен и исключить этот импорт. Функция справки это позволяет.

Таким образом, у вас будет пространство имен, которое выглядит следующим образом

(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 для решения проблемы.

Другие вопросы по тегам