5

ユーザーからインタラクティブにy/n (yes/no) の回答を得ようとする関数を書きました。回答が有効かどうかをテストし、そうでない場合はユーザーに再度要求します。

(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 を使用した上記のバージョンはその仕事をしますが、これを行うためのより良い (より機能的な) 方法が必要であると私はしつこく感じています。read-line 呼び出しを 1 回だけ行うことをお勧めします。このシナリオで loop-recur を使用せず、代わりに何らかの (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)))

let2 つの関数が気になる場合は、バインディングで「ask」を定義することもできます。

于 2012-07-25T21:15:52.133 に答える