Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Clojure中从键盘读取用户输入的Lispy方法?_Clojure_Keyboard Input - Fatal编程技术网

在Clojure中从键盘读取用户输入的Lispy方法?

在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

我正在为Clojure程序编写一个函数,用于从键盘读取用户输入。如果用户输入无效的输入,系统将警告用户,然后再次提示用户。在Python这样的语言中使用过程风格时,我会这样做:

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内置的