clojure で何らかの処理を行った後、関数から値を返すにはどうすればよいですか。
Java のコード
private int add() {
int i = 0;
if (i == 0) i++;
if (i == 1) i += 2;
else i += 3;
}
let を使用することを考えましたが、if ステートメントが多すぎるため、どのように返せばよいかわかりません。
clojure で何らかの処理を行った後、関数から値を返すにはどうすればよいですか。
Java のコード
private int add() {
int i = 0;
if (i == 0) i++;
if (i == 1) i += 2;
else i += 3;
}
let を使用することを考えましたが、if ステートメントが多すぎるため、どのように返せばよいかわかりません。
i
最も簡単な音訳は、次のように、 の新しい値ごとに新しいローカルに名前を付けるだけです。
(defn add []
(let [i 0
i' (if (= i 0) (inc i) i)
i'' (if (= i' 1)
(+ 2 i')
(+ 3 i'))]
i''))
これらのローカルはすべて、i
と呼ぶのではなく、 という名前にすることもできますがi'
、不変性の問題を混同したくありませんでした。変更i
を加えるわけではなく、新しい値にバインドされた新しい名前付きローカルを導入するだけです。
コードのパターンは次のとおりです。
if-else-expr(init-value) -> value1
if-else-expr(value1) -> value2
if-else-expr(value2) -> value3
if-else-expr...
次のようにclojureで実装できます
(defn add []
(-> init-value
(#(if (expr1-1) (expr1-2) (expr1-3)))
(#(if (expr2-1) (expr2-2) (expr2-3)))
(#(if (expr3-1) (expr3-2) (expr3-3)))
...))
あなたの場合:
(defn add []
(-> 0
(#(if (= % 0) (+ % 1) %))
(#(if (= % 1) (+ % 2) (+ % 3)))))