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.