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

欢迎!请查看 关于 页面以获取更多关于这如何工作的小信息。

0
ClojureScript

ClojureScript 对 {{clojure.string/escape}} 函数的实现假定 {{cmap}} 参数总是映射类型。这使得它不同于(并且特别地不如)Clojure 对函数的实现,后者允许 {{cmap}} 为任何可调用的。

以下是 {{clojure.string/escape}} 实现的相关行,在 (link: https://github.com/clojure/clojure/blob/master/src/clj/clojure/string.clj#L313 text: Clojure) 和 (link: https://github.com/clojure/clojurescript/blob/master/src/main/cljs/clojure/string.cljs#L216 text: ClojureScript)。ClojureScript 实现对 {{cmap}} 调用 {{get}},而 Clojure 实现直接调用 {{cmap}}。

以下是一个在 Clojure 上工作但在 ClojureScript 上不工作的示例,因为它将函数传递给 {{clojure.string/escape}} 而不是映射

`
(defn regex-escape
"字符串 s 中的正则特殊字符转义。"
[s]
(let [special? #{\- \[ \] \{ \} \( \) \* \+ \? \. \\ \^ \$ \|}]]

(clojure.string/escape s #(when (special? %) (str \\ %)))))

`

理想情况下,这个问题将通过改变 ClojureScript 对 {{clojure.string/escape}} 的实现以匹配 Clojure 实现来修复。这将也会与两个平台的函数文档字符串中描述的行为相匹配。

2 个答案

0

评论由:mfikes 提供

0001-CLJS-2268-Make-clojure.string-escape-constent-with-C.patch 已添加到补丁摊位 (i)

0
参考: https://clojure.atlassian.net/browse/CLJS-2268(由 alex+import 提出)
...