5

我编写了一个函数,试图以交互方式从用户那里获得 ay/n(是/否)答案。它测试答案是否有效,如果不是,则再次请求用户:

(defn get-valid-answer [question]
   (println  question)
   (loop []
     (let [ans (.trim (read-line))]
        (if (#{"y" "n"} ans)
            ans
            (do (println "Please answer \"y\"[yes] or \"n\"[no] only!")
                (recur) )))))

上面带有循环递归的版本可以完成这项工作,但我觉得必须有更好(更实用)的方法来做到这一点。我宁愿只进行一次 read-line 调用。任何人都可以建议在这种情况下不使用循环递归但可能使用某些(Clojure 内置)宏的替代版本吗?

4

1 回答 1

7

想象一个小孩没完没了地问同一个问题,直到得到满意的答复,然后用代码做同样的事情。也就是说,从层出不穷的问题中获取第一个有效的答案。

未经测试,但这应该可以解决问题。

(defn ask []
  (println "Please answer \"y\"[yes] or \"n\"[no]:")
  (.trim (read-line)))

(defn get-valid-answer [question]
  (println question)
  (->> (repeatedly ask)
       (filter #{"y" "n"})
       (first)))

let如果有两个功能困扰您,您还可以在绑定中定义“询问” 。

于 2012-07-25T21:15:52.133 回答