2010-11-23 18 views
10

Estoy escribiendo una función para mi programa Clojure que lee la entrada del usuario desde el teclado. Si el usuario ingresa una entrada no válida, se avisa al usuario y luego se le solicita nuevamente. Cuando se utiliza un estilo de procedimiento en un lenguaje como Python, me gustaría hacer algo como esto:Lispy forma de leer la entrada del usuario desde el teclado en Clojure?

while 1: 
    value = input("What is your decision?") 
    if validated(value): 
     break 
    else: 
     print "That is not valid." 

Lo mejor que puedo llegar a en Clojure es la siguiente:

(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))))) 

Esto funciona, pero es redundante y parece detallado. ¿Hay alguna forma más de Lispy/Clojurey para hacer esto?

Respuesta

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

Factor cabo el println/combo leer línea en una función 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?"))))) 

Esto es básicamente lo que hace su versión de Python; la diferencia es que get-input está incorporado para Python.

Cuestiones relacionadas