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 已经引用:#'clojure.core/unsigned-bit-shift-right 在命名空间:cljs.core,被替换为:#'cljs.core/unsigned-bit-shift-right

我找到了一些谷歌条目,但没有一个能让我更进一步。这是关于什么的?

4

1 回答 1

5

这是由在 clojure.core 命名空间和 cljs.core 中发现符号 unsigned-bit-shift-right 引起的。clojure.core 命名空间在 cljs.core 之前编译/加载,新符号的引入正在引发警告。看起来,从命名空间来看,您正在编写 clojurescript。如果你在第 2147 行查看这个文件cljs.core,你会看到这个表格:

(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 行开始使用无符号位移位右没有前缀,因此它们必须使用 clojure.core 实现。奇怪。上面的表格出现在所有以前的使用之后。可以肯定地说,可以安全地排除符号。事实上,这可能值得一个补丁......

要解决此问题,您可能需要尝试显式声明命名空间导入并排除该导入。参考功能提供了这一点。

所以,你会有一个看起来像这样的命名空间

(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 回答