2024 年 Clojure 状况调查! 分享你的想法。

欢迎!请查看 关于 页面以了解更多信息。

0
ClojureScript

当使用模式和一个函数调用 clojure.core/replace 时,Clojurescript 版本委托给 JavaScript 的 s.replace 方法,这个方法根据你的模式中有多少个匹配组用可变数量的参数调用该函数。Clojure 版本总是用单个参数调用它,如果模式中有匹配组,它可能是一个向量。

我不确定这是否是故意的。如果不是,我认为可以通过使用 re-find 来修复这个差异,因为 re-find 似乎返回你在 Clojure 中得到的相同字符串或向量。如果是出于性能原因而故意这样做,也许应该更新文档字符串并指出这一点,因为没有警告函数被调用时参数过多。

3 答案

0

由:cgag 发布的评论

我不知道如何编辑,但我想包含一个简单的示例

CLJS
(clojure.string/replace "hello world" #"(hello) world" (fn (link: m) (.log js/console (str "Match: " m)) m))

将记录: "Match: hello world"

CLJ
user=> (clojure.string/replace "hello world" #"(hello) world" (fn (link: m) (println (str "Match: " m) m)))
Match: (link: "hello world" "hello") (link: hello world hello)

NullPointerException java.util.regex.Matcher.quoteReplacement (Matcher.java:655)

0

由:mfikes 发布的评论

也许在 ClojureScript 1.9.946 中这个问题已经得到了解决。

cljs.user=> (clojure.string/replace "hello world" #"(hello) world" (fn [m] (println (str "Match: " m) m))) Match: ["hello world" "hello"] [hello world hello] "null"

0
参考:[https://clojure.atlassian.net/browse/CLJS-746](https://clojure.atlassian.net/browse/CLJS-746)(由 alex+import 报告)
...