Lispy way to read user input from the keyboard in Clojure?
I am writing a function for my Clojure program that reads user input from the keyboard. If the user enters invalid input, the user is warned and then prompted again. When using a procedural style in a language like Python, I would do something like this:
while 1:
value = input("What is your decision?")
if validated(value):
break
else:
print "That is not valid."
The best I can 开发者_运维问答come up with in Clojure is this:
(loop [value (do
(println "What is your decision?")
(read-line))]
(if (validated value)
value
(recur (do
(println "That is not valid.")
(println "What is your decision?")
(read-line)))))
This works, but it is redundant and seems verbose. Is there a more Lispy/Clojurey way to do this?
(defn input []
(println "What is your decision?")
(if-let [v (valid? (read-line))]
v
(do
(println "That is not valid")
(recur)))
Factor out the println/read-line combo into a get-line function:
(defn get-input [prompt]
(println prompt)
(read-line))
(defn get-validated-input []
(loop [input (get-input "What is your decision?")]
(if (valid? input)
value
(recur (get-input "That is not valid.\nWhat is your decision?")))))
This is basically what your Python version does; the difference is that get-input is built-in for Python.
精彩评论