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

欢迎!有关如何工作的更多信息,请参阅关于页面。

0 投票
Clojure
建议将修剪函数(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. 函数利用String实现细节来
   编写高性能的循环/递归,而不是使用高阶
   函数。(这通常不是通用应用程序
   代码中的约定。)"

最初我有一个解决方案,其中我用 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字符,这不足以判断是否应该删除。

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

如果这些API增强没有启用对任意Unicode代码点的测试就进行,我没有任何反对意见。过去,类似的建议在Clojure的内置库中曾被拒绝,例如CLJ-945。

0 投票
_评论者:sztamas_

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

在Java的String和Character API中,接受char的函数只处理基本多语言平面(BMP)中的字符。
trim?接受一个字符,因此按照同样的行为,它只为删除BMP中的字符工作。

我认为这也可以,但鉴于高位/低位代理字符和BMP字符是相互独立的,实际上可以使用相同的实现在BMP之外删除Unicode代码点。你只需要说代码点的所有高低代码单元都是“不想要的”。

示例
0 投票

评论者:jafingerhut

我同意,但可能最好不推荐使用trimr来删除这些内容,因为如果它匹配集合中的某个成员,它将删除两个高位/低位代理中的UTF-16 Java字符之一,即使另一个代理没有匹配任何内容,这也将留下一个有问题的UTF-16字符串。

再次强调,最好的做法可能是根本不将其包含在实现中,最多在文档中提醒这一点,或者是通过在循环中检查高位/低位代理来处理它。

0 投票

评论者:sztamas

是的,你是对的。这个解决方案在所有情况下都不会工作,因此不建议使用。

我轻微倾向于让trim?接受字符并且仅用于去除BMP字符。这在争议中可能已足够应对大多数情况。
另一种解决方案可以适用于所有情况,但此时trim?必须接受int、2个字符或字符串,因此trim?将不再直观(尽管更接近现实世界 :-)),编写这些trim?函数也将不太友好。

话虽如此,如果需要,我愿意更改实现以做到这一点。

目前,我甚至不确定这个增强功能会被接受、拒绝,或者进行这一过程的具体步骤是什么。

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