我写了一个函数,试图以交互方式从用户那里得到一个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内置)宏吗?
答案 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'。