10

最近、コンソールから日付を繰り返し読み取る必要がある小さな CLI スクリプトを作成していました (読み取る日付の数は計算され、毎回異なる可能性があります)。Ruby コードのサンプル:

dates = x.times.collect { print "Enter date: "; Date.parse(gets.chomp) }

念のため、Clojure でスクリプトを作成し、かなり醜いコードをswap!andで使用することになりloop...recurました。Clojure で目的の効果を達成するための最もクリーンな方法は何だろうと思っています。(Clojure には がありdotimesますが、本体の評価から返された値は保持されません...純粋な関数型プログラミングを強調する言語から予想されるように。)

4

3 に答える 3

10

read-line は、ファイルの終わりに到達すると nil を返します。CTRL-d (Windows では CTRL-z)を押したときのコンソール。

このコードを使用して、これを利用できます。

(doseq [line (repeatedly read-line) :while line]
    (do-something-with line))

一定数の行を読み取る必要がある場合は、次を使用できます。

(repeatedly n read-line)
于 2012-07-14T16:10:06.117 に答える
9

あなたの目標がx、ユーザーが入力した正確な日付のシーケンスで終わることである場合:

(for [line (repeatedly x read-line)] (DateFormat/parse line))

または使用map

(map DateFormat/parse (repeatedly x read-line))

Clojure の遅延シーケンスに注意してください。ユーザーは、必要に応じてさらに日付を入力するよう求められます。ユーザーが一度にすべての日付を入力することが目標である場合 (起動時など)、次を使用しますdoall

(map DateFormat/parse (doall (repeatedly x read-line)))

これにより、すべての日付が一度に読み取られますが、それでも遅延解析が行われるため、日付形式の検証はプログラムの後半で失敗する可能性があります。1 レベル上に移動doallして、迅速に解析することもできます。

(doall (map DateFormat/parse (repeatedly x read-line)))

また、ヘルパー関数を使用して、プロンプトで行を読み取ることができます。

(defn read-line-with-prompt [prompt]
  (print prompt)
  (read-line))

次に、次のいずれかに置き換えread-lineます。

#(read-line-with-prompt "Enter date: ")

また

(partial read-line-with-prompt "Enter date: ")
于 2012-07-14T22:33:48.720 に答える
4

次のようなことができます。

(defn read-dates [n] 
     (doall  (for [_ (range n)] (java.util.Date/parse (read-line)))))

(def my-dates (read-dates 5)) ;Read 5 dates from console
于 2012-07-14T13:46:37.953 に答える