2010-11-23 7 views
10

Я пишу функцию для своей программы Clojure, которая считывает ввод с клавиатуры. Если пользователь вводит неверный ввод, пользователь предупреждается, а затем запрашивается снова. При использовании процедурного стиля в языке, как Python, я хотел бы сделать что-то вроде этого:Lispy способ читать пользовательский ввод с клавиатуры в Clojure?

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?

ответ

21
(defn input [] 
    (println "What is your decision?") 
    (if-let [v (valid? (read-line))] 
     v 
     (do 
     (println "That is not valid") 
     (recur))) 
8

фактор вне Println/чтения строки комбо в функцию прибудете линии:

(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 делает; разница заключается в том, что вход-вход встроен для Python.

 Смежные вопросы

  • Нет связанных вопросов^_^