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

欢迎!请查看关于页面以获取更多关于该功能的信息。

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字符的代码点的一半,然后将一个32位int传递给trim?,或者类似的方法。

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

0
_评论者:sztamas_

是的,UTF-16编码和Character代表的一个代码点或半个代码点的表示确实是相当混乱的,不是吗?

在Java String和Character API中,接受char的方法仅处理基本多语言平面(BMP)中的字符。
trim?接受一个字符,因此根据这种行为,它只适用于移除基本多语言平面中的字符。

我认为这确实可以,但进一步的,因为高位代理和高位齿轮以及BMP字符是互斥的,您可以实际使用相同的实现删除不在BMP中的Unicode代码点。您只需说该代码点的两个码元单元都是“不需要的”。

示例
0

评论者:jafingerhut

同意,但可能最好不建议使用trimr的这种实现来删除这类东西,因为它如果匹配到一个集合的成员,将会移除两个UTF-16高/低位替换符中的一个,即使另一个替换符 匹配到集合中的任何东西,这将会留下一个不规则的UTF-16字符串。

再次强调,最好的做法可能是不在实现中包含它,或者最多在文档中提出警告,或者通过在循环中检查高/低位替换符来在实现中处理它。

0

评论者:sztamas

是的,你是对的。那个方法在所有情况下都不会工作,所以不能推荐。

我略微倾向于让trim?接受字符并且仅用于删除BMP字符。这可能会在大多数用例中足够。
另一种解决方案可以用于所有用例,但那时trim?将必须接受int类型、两个字符或一个字符串,因此trim?将不太直观(尽管更接近现实世界:-)),这些trim?函数的编写也不会那么友好。

话虽如此,如果需要,我很乐意更改实现。

目前,我甚至不确定这个增强功能是被接受、拒绝,还是审查的流程是什么。

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