我编写了一个函数,试图以交互方式从用户那里获得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) )))))
Run Code Online (Sandbox Code Playgroud)
带有loop-recur的上述版本完成了这项工作,但我有一种唠叨的感觉,必须有更好的(更多功能)方法来做到这一点.我宁愿只进行一次读取线调用.任何人都可以建议在这种情况下不使用loop-recur的替代版本,但可能使用一些(Clojure内置)宏而不是?
想想一个小孩子无休止地问同样的问题,直到得到满意的答复,然后在代码中做同样的事情.也就是说,从无穷无尽的问题中获取第一个有效答案.
未经测试,但这应该可以解决问题.
(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)))
Run Code Online (Sandbox Code Playgroud)
let
如果两个函数困扰你,你也可以在绑定中定义'ask' .