gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 08:31:00 25 4
gpt4 key购买 nike

我在使用 (: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) 语句。

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

WARNING: read already refers to: #'clojure.core/read in namespace: clj-osf.crud, being replaced by: #'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 是核心中的一个很好的例子(它加载了一堆子文件)。

一个更完整的例子:

foo/core.clj:

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

(defn read [] "hi")
(load "bar")

foo/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"

关于Clojure : (:refer-clojure :exclude [read]) 显然不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26759873/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com