【问题标题】:Clojure: (:refer-clojure :exclude [read]) apparently not workingClojure: (:refer-clojure :exclude [read]) 显然不起作用
【发布时间】:2015-01-01 19:16:00
【问题描述】:

我遇到了(:refer-clojure :exclude [read]) 的问题。我的设置如下:

我有一个文件foo.clj,它是:

(ns foo.core)

(load "foo_bar")

然后我有一个文件bar.clj,它是:

(ns foo.core
  (:refer-clojure :exclude [read]))

(defn read [])

在我的应用程序中,我确实在多个文件中拆分了一个命名空间。这就是为什么我在作为入口点的foo.clj 文件中有一系列(load) 语句。

问题是当我编译这个文件时,我仍然得到著名的错误:

警告:读取已引用:#'clojure.core/read 在命名空间:clj-osf.crud,被替换为:#'clj-osf.crud/read

我认为这不是什么大问题,但问题是当我从另一个应用程序中使用该库时,其他应用程序将无法编译并告诉我 foo.core/read 根本不存在。

我也尝试将foo.clj更改为:

(ns foo.core
  (:refer-clojure :exclude [read]))

(load "foo_bar")

但同样的问题也会发生。这是 Clojure 中的错误,还是我遗漏了什么?

我正在使用 Clojure 1.6

【问题讨论】:

    标签: clojure


    【解决方案1】:

    您使用的 ns'es 似乎与您的文件名不匹配。我不确定这只是草率的例子,还是这实际上是问题所在。

    通常当您跨文件拆分命名空间时,加载的文件应以(in-ns 'foo.core) 开头,而不是(ns foo.core)。 clojure.pprint 是核心中的一个很好的例子(它加载了一堆子文件)。

    一个更完整的例子:

    foo/core.clj:

    (ns foo.core
      (:refer-clojure :exclude [read]))
    
    (defn read [] "hi")
    (load "bar")
    

    foo/bar.clj:

    (in-ns 'foo.core)
    (defn read2 [] (str (read) " there"))
    

    如果我再开始一个 repl:

    user=> (require 'foo.core)
    nil
    user=> (foo.core/read)
    "hi"
    user=> (foo.core/read2)
    "hi there"
    

    【讨论】:

    • 非常感谢!这不是因为一个草率的例子,而是这些例子背后的人。我没有注意到这种特殊性。请注意有时玩把戏,因为我在其他项目中这样做过......无论如何,这就是问题所在。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-05
    • 1970-01-01
    相关资源
    最近更新 更多