Solution for How to chain function calls in Clojure?
is Given Below:
Imagine I have a string which I want to transform as follows:
- Remove all spaces.
- Remove all dots.
- Make the string lower-case.
One way to do it is this:
(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) ] ;; ... ) )
How can I “chain” the functions
clojure.string/lower-case so that
- the output of
(clojure.string/replace s " " "")is fed to the input of
(clojure.string/replace clean-string1 "." "")and its output is fed to the input of
so that I don’t need intermediate variables
You just do it the same way you would in any language. You’re asking for function composition, which in math or non-lisp languages looks like
f(g(x)). In lisp of course that’s
(f (g x)), but the principle is the same.
(require '[clojure.string :as s]) (s/lower-case (s/replace (s/replace s " " "") "." ""))
is the most straightforward answer. But it’s rather unpleasant to have this level of nesting where the function names are so far removed from their extra arguments, and so most people would instead write
(-> s (s/replace " " "") (s/replace "." "") (s/lower-case))
which is the same thing but just using
-> to shuffle the forms around a bit for clarity.