10

キーボードからユーザー入力を読み取る Clojure プログラムの関数を作成しています。ユーザーが無効な入力を入力すると、警告が表示され、再度プロンプトが表示されます。Python のような言語で手続き型スタイルを使用する場合、次のようにします。

while 1:
    value = input("What is your decision?")
    if validated(value):
        break
    else:
        print "That is not valid."

私がClojureで思いつくことができる最高のものはこれです:

(loop [value (do
               (println "What is your decision?")
               (read-line))]
  (if (validated value)
    value
    (recur (do
             (println "That is not valid.")
             (println "What is your decision?")
             (read-line)))))

これは機能しますが、冗長で冗長に見えます。これを行う Lispy/Clojurey の方法はありますか?

4

2 に答える 2

21
(defn input []
   (println "What is your decision?")
   (if-let [v (valid? (read-line))]
      v
      (do
         (println "That is not valid")
         (recur)))
于 2010-11-23T01:10:32.387 に答える
8

println/read-line の組み合わせを get-line 関数に分解します。

(defn get-input [prompt]
  (println prompt)
  (read-line))

(defn get-validated-input []
  (loop [input (get-input "What is your decision?")]
    (if (valid? input)
      value
      (recur (get-input "That is not valid.\nWhat is your decision?")))))

これは基本的に、お使いの Python バージョンが行うことです。違いは、get-input が Python に組み込まれていることです。

于 2010-11-23T19:13:42.120 に答える