2010-11-23 116 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 /读取线组合成一个get-线功能:

(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中的。