Clojure :(:refer-clojure:exclude [read])显然不起作用

Neo*_*mov 2 clojure

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

我有一个文件foo.clj是:

(ns foo.core)

(load "foo_bar")
Run Code Online (Sandbox Code Playgroud)

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

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

(defn read [])
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

我也尝试改变foo.clj:

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

(load "foo_bar")
Run Code Online (Sandbox Code Playgroud)

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

我正在使用Clojure 1.6

Ale*_*ler 6

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

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

一个更全面的例子:

富/ core.clj:

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

(defn read [] "hi")
(load "bar")
Run Code Online (Sandbox Code Playgroud)

富/ bar.clj:

(in-ns 'foo.core)
(defn read2 [] (str (read) " there"))
Run Code Online (Sandbox Code Playgroud)

如果我然后开始一个repl:

user=> (require 'foo.core)
nil
user=> (foo.core/read)
"hi"
user=> (foo.core/read2)
"hi there"
Run Code Online (Sandbox Code Playgroud)