Лиспый способ читать пользовательский ввод с клавиатуры в Clojure? - PullRequest
10 голосов
/ 23 ноября 2010

Я пишу функцию для моей программы 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)))))

Это работает, но это излишне и кажется многословным.Есть ли более лиспийский / Clojurey способ сделать это?

Ответы [ 2 ]

21 голосов
/ 23 ноября 2010
(defn input []
   (println "What is your decision?")
   (if-let [v (valid? (read-line))]
      v
      (do
         (println "That is not valid")
         (recur)))
8 голосов
/ 23 ноября 2010

Измените комбинацию 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.

...