Clojure:(:refer Clojure:exclude〔read〕)显然不起作用



我的(: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)语句的原因。

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

警告: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中的一个错误,还是我遗漏了什么?

我正在使用Clojure 1.6

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

通常,在文件之间拆分命名空间时,加载的文件应该以(in-ns 'foo.core)开头,而不是以(ns foo.core)开头。clojure.print是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"))

如果我开始回复:

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

最新更新