2010-11-23 11 views
10

Klavyeden kullanıcı girdisini okuyan Clojure programım için bir işlev yazıyorum. Kullanıcı geçersiz girdiye girerse, kullanıcı uyarılır ve tekrar sorulur. Ben Clojure içinde birlikte gelebilir iyi şudurClojure'deki klavyeden kullanıcı girişini okumanın kolay yolu?

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

: Python gibi bir dilde bir usul tarzı kullanırken, böyle bir şey yapacağını

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

Bu çalışır, ancak o gereksiz ve ayrıntılı görünüyor. Bunu yapmak için daha Lispy/Clojurey yolu var mı? bir get-line fonksiyonu içine println/okuma çizgisini açılan dışarı

cevap

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

Faktör:

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

Bu temelde Python sürümü yaptığı iştir; Fark, get-input'un Python için yerleşik olmasıdır.

İlgili konular