如何在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))

这是同样的事情,只是使用->来洗牌周围的形式一点清晰。

相关内容

  • 没有找到相关文章

最新更新