假设我有一个字符串,我想按照如下方式进行转换:
- 删除所有空格
- 删除所有圆点。
- 把字符串改成小写
一种方法是:
(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/replace
和clojure.string/lower-case
,使
(clojure.string/replace s " " "")
输出馈送到 输入(clojure.string/replace clean-string1 "." "")
,其输出馈入 输入(clojure.string/lower-case clean-string2)
这样我就不需要中间变量clean-string1
和clean-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))
这是同样的事情,只是使用->
来洗牌周围的形式一点清晰。