在 Clojure 中的命名空间中隐藏核心函数

lyh*_*kia 0 clojure

我正在尝试隐藏我的命名空间之一中的核心函数。代码的工作原理如下:

核心.clj:

(ns test.core
  (:refer-clojure :exclude [zero?])
  (:require [test.z :refer [zero?]]))

(defn -main
  (prn (zero? 1)))
Run Code Online (Sandbox Code Playgroud)

z.clj:

(ns test.z
  (:refer-clojure :exclude [zero?]))
(defn zero? [x] (+ x 1))
Run Code Online (Sandbox Code Playgroud)

运行时,显示错误信息:

; (err) WARNING: zero? already refers to: #'clojure.core/zero? in namespace: test.z, being replaced by: #'test.z/zero?
Run Code Online (Sandbox Code Playgroud)

我不确定 Clojure 是否允许这样做,有人可以帮助我吗?多谢!


编辑:这似乎是问题所在,但错误消息确实令人困惑。不管怎样,非常感谢!

Sea*_*eld 5

您的-main函数缺少参数声明,因此,按照代码所示,它是不合法的。但是,如果添加参数,它会按照标准 Clojure CLI 的预期工作:

seanc@DESKTOP-30ICA76:~/clojure/test.core$ cat src/test/core.clj
(ns test.core
  (:refer-clojure :exclude [zero?])
  (:require [test.z :refer [zero?]]))

(defn -main [& args]
  (prn (zero? 1)))
seanc@DESKTOP-30ICA76:~/clojure/test.core$ cat src/test/z.clj
(ns test.z
  (:refer-clojure :exclude [zero?]))
(defn zero? [x] (+ x 1))
seanc@DESKTOP-30ICA76:~/clojure/test.core$ clojure -M -m test.core
2
seanc@DESKTOP-30ICA76:~/clojure/test.core$ clj
Clojure 1.10.2
user=> (require '[test.core])
nil
user=> (test.core/-main)
2
nil
user=>
Run Code Online (Sandbox Code Playgroud)

如您所见,没有任何警告。由于函数中的错误(缺少参数),可能会出现警告-main。也有可能您用来加载/运行代​​码的任何工具都在做一些错误/不明智的事情——但您没有提供任何相关细节。