请在 2024 年 Clojure 状态调查!中分享您的想法。

欢迎!请查看 关于 页面以了解更多关于本网站如何运作的信息。

0 票(
ClojureScript

覆盖在 cljs.core 中定义的符号工作得很好,并打印出一个预期的警告。这种情况失败的一个例子是当被替换的符号最初是一个宏并且没有被命名空间限定的情况下调用。例如:

`}
;;;;;;; 文件 a ;;;;;;
(ns file.a)
(defn + [& vals]
(prn "被调用!")
(apply cljs.core/+ vals))
;;;;;;; 文件 b ;;;;;;
(ns file.b
(:require [file.a :refer [+]]))
(+ 1 2) ;; 不打印 "被调用!"
(file.a/+ 1 2) ;; 打印 "被调用!"
(var +) => file.a/+
(+ 1 2) ;; 打印 "被调用!" ``
}

在文件 b 中,单独的符号 + 调用了 cljs.core/+ 而不是预期的 file.a/+,尽管它被引用了并且所有的变量解析都解析到了 file.a/+.这并不适用于覆盖 cljs.core 中的函数,例如覆盖函数 map 就没问题。

`
;;;;;;; 文件 a ;;;;;;
(ns file.a)
(defn map [f coll]
(prn "map 被调用!")
(cljs.core/map f coll))
;;;;;;; 文件 b ;;;;;;
(ns file.b
(:require [file.a :refer [map]]))

(map inc [1 2 3]) => "map 被调用!" (2 3 4)
`
}

1 答案

0 票(
...