在Clojure中从键盘读取用户输入的Lispy方法?
我正在为Clojure程序编写一个函数,用于从键盘读取用户输入。如果用户输入无效的输入,系统将警告用户,然后再次提示用户。在Python这样的语言中使用过程风格时,我会这样做:在Clojure中从键盘读取用户输入的Lispy方法?,clojure,keyboard-input,Clojure,Keyboard Input,我正在为Clojure程序编写一个函数,用于从键盘读取用户输入。如果用户输入无效的输入,系统将警告用户,然后再次提示用户。在Python这样的语言中使用过程风格时,我会这样做: while 1: value = input("What is your decision?") if validated(value): break else: print "That is not valid." 在Clojure我能想到的最好的办法是: (l
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的方法来实现这一点?将println/read-line组合分解成一个get-line函数:
(defn input []
(println "What is your decision?")
(if-let [v (valid? (read-line))]
v
(do
(println "That is not valid")
(recur)))
(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内置的