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

欢迎!请参阅关于页面以了解此功能的一些更多信息。

0投票
Clojure
建议trim函数(trim、triml和trimr)新增第二个参数,即函数{{trim?}}


[trim? ^CharSequence s]


{{trim?}}首先提供以支持部分应用。

新文档字符串将是


"从字符串的两端删除字符。
 如果省略trim?,则删除空格。当提供时,它接受
 一个字符,并返回如果应删除该字符则返回true。


示例测试


(deftest t-trim
  (is (= "foo" (s/trim "  foo  \r\n")))
  (is (= "bar" (s/trim "\u2000bar\t \u2002")))

  ;; 其他测试
  (is (= "bar" (s/trim "$%#\u2000bar\t \u2002%$#")))
                       #(or (Character/isWhitespace %) ((set "$#%") %))))))



类似于Python的strip - https://docs.pythonlang.cn/2/library/stdtypes.html#str.strip

*方法:* 建议的解决方案不是很DRY,但它遵循文件顶部的设计指南,更确切地说,是第3点

"3. 函数利用字符串实现细节来
   编写高性能循环/递归,而不是使用高阶函数。 (这在通用应用代码中不是惯例。)"
   
   

最初我有一个解决方案,用pred替换当前实现中的Character/isWhitespace,pred默认为is-whitespace?函数。
当然,那段代码更简洁,trim-newline也可以直接调用trimr,这样可以消除重复,但增加了总是调用函数的开销,而不是直接调用Character/isWhitespace。

我认为唯一可以最优化和DRY的代码方法是使用宏,但我认为它不一定会导致更简洁的代码。

鉴于string.clj中其他函数的现有设计风格,我认为最好的解决方案就是简单地复制,以优化代码。

7 个回答

0投票

评论者:sztamas

提议的解决方案。代码 + 测试。

0投票

评论者:sztamas

添加了一个新补丁,将 pred 重命名为 trim?

0投票

评论者:jafingerhut

请注意,Java(因此Clojure/Java)使用UTF-16编码在内存中的字符串。因此,如果您想从一个字符串的开始和/或结束处去除一组Unicode代码点,trim?的API只接受单个16位Java字符,不能提供足够的信息来确定是否应该去除。

如果您想要处理这种通用性,将需要一个更复杂的实现,该实现检查第一个/最后一个字符是否是编码为2个16位Java字符的代码点的一半,并将其传递给trim?,或是类似的方法。

我不会反对在没有启用对任意Unicode代码点的测试的情况下,对这些API增强进行改进。在Clojure内置库中,过去已经拒绝过类似的建议,例如CLJ-945。

0投票
评论者:sztamas

是的,UTF-16编码以及Character表示代码点或半代码点确实有些混乱,不是吗?

Java String和Character API的接受char的方法仅处理基本多语言平面中的字符。
trim?接受一个字符,因此遵循同样的行为,它仅适用于移除基本多语言平面中的字符。

我认为这也可以,但由于高/低代理和高/低代理字符与BMP字符互不重叠,您实际上可以使用相同的实现来移除不在BMP中的Unicode代码点。您可以说代码点的两个代码单元都“不受欢迎”。

示例
0投票

评论者:jafingerhut

同意,但可能最好不要推荐这种实现 trimr 的方式来删除这类内容,因为它在匹配集合中的一个成员时,只删除两个代理代码中的 UTF-16 Java 字符中的一个,即使另一个代理代码在集合中没有任何匹配项,这会导致留下一个格式错误的 UTF-16 字符串。

再次强调,最好是根本不包含这种实现,最多在文档中进行警告,或者通过在循环中检查高/低代理代码来处理实现。

0投票

评论者:sztamas

是的,您是对的。这种解决方案在所有情况下都不会起作用,因此不能推荐。

我稍微倾向于让 trim? 接受字符并仅用于移除 BMP 字符。这辩不过足以适用于大多数用例。
另一种解决方案可以用于所有用例,但这样 trim? 将需要接受 int、两个字符或字符串,从而使 trim? 较不直观(尽管更接近现实 :-)),编写这些 trim? 函数会给用户带来不便。

话虽如此,如果需要,我很乐意更改实现来执行这些操作。

目前,我甚至不确定这个增强功能会被接受、拒绝或者这个过程是如何进行的。

0投票
参考:https://clojure.atlassian.net/browse/CLJ-1889(由 sztamas 报告)
...