我遇到了问题(: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
它似乎与您使用的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)
| 归档时间: |
|
| 查看次数: |
903 次 |
| 最近记录: |