So how do we read input in Clojure? Should be pretty easy? I thought so but didn’t find any example for reading in a loop so decided to write this blog.
So I am writing a program that simply echoes whatever user enters till the user enters the number 42. Got help here on this.
(doseq [input (take-while #(not= % "42") (repeatedly read-line))] (println input))
Let’s break down the above into smaller chunks to understand.
This just reads input from the standard input. There is some technicality that I am not going to cover. Ignore it for now.
repeatedly reads from the given function by calling it lazily. Note that. Lazily. Basically it will be lazy and won’t read anything till someone actually asks for it.
(take-while #(not= % "42") (repeatedly read-line)
take-while lazily gets the value from its second argument till some condition remains true. Here it reads from the standard input till input is not 42.
So what’s with the doseq? It makes sure that things don’t remain lazy. It’s the thing that tells that the lazy functions given above I need the result. It asks for the result. And then does something with the result. In this case it simply prints the number.