Clojure:(:refere Clojure:exclude[read])显然不起作用

Clojure:(:refere Clojure:exclude[read])显然不起作用,clojure,Clojure,我对(:请参阅clojure:exclude[read])有问题。我的设置如下: 我有一个文件foo.clj,它是: (ns foo.core) (load "foo_bar") (ns foo.core (:refer-clojure :exclude [read])) (defn read []) 然后我有一个文件bar.clj,它是: (ns foo.core) (load "foo_bar") (ns foo.core (:refer-clojure :exclude

我对
(:请参阅clojure:exclude[read])
有问题。我的设置如下:

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

(ns foo.core)

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

(defn read [])
然后我有一个文件
bar.clj
,它是:

(ns foo.core)

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

(defn read [])
在我的应用程序中,我将名称空间拆分为多个文件。这就是为什么我在作为入口点的
foo.clj
文件中有一系列
(load)
语句的原因

问题是,当我编译此文件时,仍然会出现著名的错误:

警告:read已在命名空间clj-osf.crud中引用:#“clojure.core/read”,替换为:#“clj-osf.crud/read”

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

我还尝试更改
foo.clj

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

(load "foo_bar")
但同样的问题也发生了。这是Clojure中的一个bug,还是我遗漏了什么


我正在使用Clojure 1.6

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

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

一个更完整的例子:

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"

非常感谢!这并不是因为一个草率的例子,而是真正的例子背后的人。我没有注意到这种特殊性。介意我在其他项目中做过一些把戏吗。。。无论如何,这就是问题所在。