clojure - 如何在 Clojure 中链接函数调用?

假设我有一个字符串,我想按如下方式进行转换:

  1. 删除所有空格。
  2. 删除所有点。
  3. 将字符串设为小写。

一种方法是这样的:

(defn my-function
  [s]
  (let
      [
        clean-string1 (clojure.string/replace s " " "")
        clean-string2 (clojure.string/replace clean-string1 "." "")
        clean-string3 (clojure.string/lower-case clean-string2)
       ]
    ;; ...
    )
  )

如何“链接”函数 clojure.string/replaceclojure.string/lower-case 以便

  1. (clojure.string/replace s """")的输出被馈送到
  2. 的输入
  3. (clojure.string/replace clean-string1 ".""") 并将其输出馈送到
  4. 的输入
  5. (clojure.string/lower-case clean-string2)

这样我就不需要中间变量 clean-string1clean-string2 了吗?

最佳答案

您只需像使用任何语言一样进行操作。您要求函数组合,在数学或非 lisp 语言中看起来像 f(g(x))。在 lisp 中当然是 (f (g x)),但原理是一样的。

(require '[clojure.string :as s])
(s/lower-case (s/replace (s/replace s " " "") "." ""))

是最直接的答案。但是,将函数名称从它们的额外参数中移除到这种程度的嵌套是相当不愉快的,因此大多数人会改为写

(-> s
    (s/replace " " "")
    (s/replace "." "")
    (s/lower-case))

这是同一回事,只是为了清晰起见,使用 -> 稍微打乱了表格。

https://stackoverflow.com/questions/68611024/

相关文章:

rust - 是否可以在不复制数据的情况下将 Vec<&[u8]> 展平为 &[u8] ?

r - 如何过滤列中包含少于 3 个空格的行? (右)

c# - 为什么要使用通用类型然后将其限制为具有 "where"的一种类型?

python - 在列表和元组列表之间查找公共(public) id

c++ - 来自具有大小的 char * 缓冲区的双向迭代器

python - 如何创建嵌套列表并在每个嵌套中放置特定数量的元素?列表和它的嵌套元素总是不一样的

c++ - 如何将 C 类型可变参数转换为 C++ 样式可变参数类型?

google-app-engine - F4_1G 是否属于 google app engine f

python - Django UUIDField 默认值

javascript - 我如何在 Next.js 中删除 ID 为 ="__next"的 div