簡體   English   中英

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

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM