Lispy способ чтения пользовательского ввода с клавиатуры в Clojure?
Я пишу функцию для моей программы Clojure, которая считывает пользовательский ввод с клавиатуры. Если пользователь вводит неверный ввод, пользователь предупреждается, а затем запрашивается снова. При использовании процедурного стиля на таком языке, как Python, я бы сделал что-то вроде этого:
while 1:
value = input("What is your decision?")
if validated(value):
break
else:
print "That is not valid."
лучшее, что я могу придумать в Clojure это:
(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)))))
это работает, но это кажется излишним и подробный. Есть ли более Lispy/способ Clojurey для этого?
2 ответов
(defn input []
(println "What is your decision?")
(if-let [v (valid? (read-line))]
v
(do
(println "That is not valid")
(recur)))
разложите комбинацию println/read-line на функцию get-line:
(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?")))))
это в основном то, что делает ваша версия Python; разница в том, что get-input встроен для Python.