改善循环复发

时间:2012-07-25 20:56:57

标签: clojure

我写了一个函数,试图以交互方式从用户那里得到一个y / 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) )))))

使用loop-recur的上述版本完成了这项工作,但我有一种唠叨的感觉,必须有更好的(更实用的)方法来做到这一点。我宁愿只进行一次读取线调用。任何人都可以建议在这种情况下不使用loop-recur的替代版本,但可能使用一些(Clojure内置)宏吗?

1 个答案:

答案 0 :(得分: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绑定中定义'ask'。

相关问题