通常のletをdoseqの中で使う場合
;; doseqの中で通常のletを使用
(println "=== doseqの中で通常のletを使用 ===")
(doseq [n [1 2 3]]
(let [double (* n 2)
triple (* n 3)
message (str n "の計算結果")]
(println message)
(println " 2倍:" double)
(println " 3倍:" triple)))
出力結果:
=== doseqの中で通常のletを使用 ===
1の計算結果
2倍: 2
3倍: 3
2の計算結果
2倍: 4
3倍: 6
3の計算結果
2倍: 6
3倍: 9
doseqの:letを使う場合
;; doseqの:letを使用
(println "\n=== doseqの:letを使用 ===")
(doseq [n [1 2 3]
:let [double (* n 2)
triple (* n 3)
message (str n "の計算結果")]]
(println message)
(println " 2倍:" double)
(println " 3倍:" triple))
出力結果:
=== doseqの:letを使用 ===
1の計算結果
2倍: 2
3倍: 3
2の計算結果
2倍: 4
3倍: 6
3の計算結果
2倍: 6
3倍: 9
重要な違い:フィルタリングとの組み合わせ
通常のlet + whenの場合
;; 通常のlet + whenの場合
(println "=== 通常のlet + when ===")
(doseq [n [1 2 3 4 5 6]]
(let [double (* n 2)]
(when (> double 4) ; letで定義した変数を使って条件判定
(println n "の2倍は" double "(4より大きい)"))))
出力結果:
=== 通常のlet + when ===
3の2倍は6(4より大きい)
4の2倍は8(4より大きい)
5の2倍は10(4より大きい)
6の2倍は12(4より大きい)
doseqの:let + :whenの場合
;; doseqの:let + :whenの場合
(println "\n=== doseqの:let + :when ===")
(doseq [n [1 2 3 4 5 6]
:let [double (* n 2)]
:when (> double 4)] ; :letで定義した変数を使って条件判定
(println n "の2倍は" double "(4より大きい)"))
出力結果:
=== doseqの:let + :when ===
3の2倍は6(4より大きい)
4の2倍は8(4より大きい)
5の2倍は10(4より大きい)
6の2倍は12(4より大きい)
大きな違い:処理効率とコード構造
通常版:全要素で処理してから条件判定
;; 通常のlet + when:すべての要素でletが実行される
(println "=== 通常版:すべて処理してから判定 ===")
(doseq [n (range 1 11)]
(let [square (* n n)
is-big (> square 50)
message (str n "の2乗は" square)]
(println "計算実行:" message) ; 全部で計算される
(when is-big
(println " -> 50より大きいです!"))))
出力結果:
=== 通常版:すべて処理してから判定 ===
計算実行: 1の2乗は1
計算実行: 2の2乗は4
計算実行: 3の2乗は9
計算実行: 4の2乗は16
計算実行: 5の2乗は25
計算実行: 6の2乗は36
計算実行: 7の2乗は49
計算実行: 8の2乗は64
-> 50より大きいです!
計算実行: 9の2乗は81
-> 50より大きいです!
計算実行: 10の2乗は100
-> 50より大きいです!
doseq版:条件を満たす要素のみ処理
;; doseqの:let + :when:条件を満たす要素のみ:letが実行される
(println "\n=== doseq版:条件を満たす要素のみ処理 ===")
(doseq [n (range 1 11)
:when (> n 7) ; 先に条件でフィルター
:let [square (* n n)
message (str n "の2乗は" square)]]
(println "計算実行:" message) ; 条件を満たすもののみ計算
(println " -> 50より大きいです!"))
出力結果:
=== doseq版:条件を満たす要素のみ処理 ===
計算実行: 8の2乗は64
-> 50より大きいです!
計算実行: 9の2乗は81
-> 50より大きいです!
計算実行: 10の2乗は100
-> 50より大きいです!
使い分けのポイント
| 方法 | メリット | デメリット | 使いどころ |
|---|---|---|---|
| 通常のlet/when | 柔軟な条件分岐 | ネストが深くなる | 複雑な条件処理 |
| doseqの:let/:when | フラットな構造、効率的 | doseq専用 | シンプルなフィルター |