clojure-基本文法-フロー制御(二)

3194 ワード

もっと読む
二、異常処理
Clojureコードから出る異常はすべて運行時の異常です。もちろんClojureコードからJavaコードを呼び出すと、そのような検査が必要な異常が出てくるかもしれません。try、catch、finallyおよびthrowは、javaと同様の機能を提供しています。
try、catch、throw、finally:

user=> (try (throw (Exception. "error")) (finally (println "final")))
final
Exception error  user/eval310 (NO_SOURCE_FILE:1)

user=> (try (/ 3 0) (catch Exception e (println e)))
#
nil
クラス:
表式をテストします。この表式の値がfalseであれば、異常を投げます。

user=> (assert true)
nil
user=> (assert false)
AssertionError Assert failed: false  user/eval317 (NO_SOURCE_FILE:1)
user=> (assert nil)
AssertionError Assert failed: nil  user/eval319 (NO_SOURCE_FILE:1)
user=> (assert 0)
nil
user=> (assert [1 2 3])
nil
user=> (assert "foo")
nil
三、関数によるフロー制御
repeatedly:
repeat edilyは、文字どおり、重複関数という意味です。一般的な使い方は以下の通りです。

user=> (repeatedly 5 #(rand-int 11))
(6 8 2 6 6)
5回の乱数を繰り返します。rand-int 11は0から11までの乱数を表します。
ここでは、repeat関数:repeat関数は、1/2の定数パラメータを受け取ります。使い方は以下の通りです。

user=> (repeat 5 (int (rand-int 100)))
(30 30 30 30 30)
repeat、repeat edily関数が一つのパラメータしか受け入れられない場合(つまり、繰り返し回数がないパラメータ)は、takeと協力して中止しなければなりません。メモリオーバーフローのエラーが発生します。以下のとおりです

user=> (repeatedly #(rand-int 11))
OutOfMemoryError Java heap space  java.util.Arrays.copyOf (Arrays.java:2882)
user=> (take 5 (repeatedly #(rand-int 11)))
(10 7 0 2 8)
iterate:
反復関数の形式は以下の通りです。
(iterate f v)
相当于:
while(true){v=f(v)}
だから、普通は協力して中止します。

user=> (take 10 (iterate inc 5)) ; (5 6 7 8 9 10 11 12 13 14)
user=> (take 10 (iterate #(+ % 5) 5)) ; (5 10 15 20 25 30 35 40 45 50)
user=> (take 10 (iterate #(* % 2) 2)) ; (2 4 8 16 32 64 128 256 512 1024)
四、シーケンスによるフロー制御
dotimes:
dotimesは与えられた表現の一定回数を実行します。ローカルbindingは0から与えられた値を与えられます。以下のとおりです

user=> (dotimes [num 3] (println "number:" (inc num)))
number: 1
number: 2
number: 3
nil
doseq:
doseqとforの文法は同じですが、forはlazy seqに戻り、doseqは任意の数の表現を受け取り、副作用がある方法で行い、nilに戻ります。

user=> (doseq [i (range 10)] (println i))
0
1
2
3
4
5
6
7
8
9
nil
user=> (doseq [i [1 2 3] j [10 20]] (println i "-" j))
1 - 10
1 - 20
2 - 10
2 - 20
3 - 10
3 - 20
nil
for:
for、doseqは、複数の集合(一番右側の最速)を巡回することをサポートします。同時に、whenと:whileを使ってフィルタリングします。

user=> (for [x (range 3 7)] (* x x))
(9 16 25 36)

user=> (for [x [0 1 2 3 4 5] :let [y (* x 3)] :when (even? y)] y)
(0 6 12)
上の第二の文は、xを集合として定義し、letを用いてyの割当値をx*3とし、最後にyが偶数であるかどうかを判断し、偶数が戻ります。