[英]Clojure: (:refer-clojure :exclude [read]) apparently not working
我遇到了(: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)
語句的foo.clj
。
問題是,當我編譯此文件時,仍然出現著名的錯誤:
警告:“ read”已經指向:#'clojure.core / read在命名空間:clj-osf.crud中,被替換為:#'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.pprint是核心的一個很好的例子(它加載了很多子文件)。
一個更完整的例子:
富/ core.clj:
(ns foo.core
(:refer-clojure :exclude [read]))
(defn read [] "hi")
(load "bar")
富/ 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"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.