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