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