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 "匹配: " m) m))) 匹配: ["hello world" "hello"] [hello world hello] "null"

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