首页 文章

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

提问于
浏览
2

我遇到了 (: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已经引用:#'clojure.core /在命名空间中读取: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

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")
    

    富/ bar.clj:

    (in-ns 'foo.core)
    (defn read2 [] (str (read) " there"))
    

    如果我然后开始一个repl:

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

相关问题