0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

doseqの中での通常のlet/whenと:let/:whenの違い

0
Last updated at Posted at 2025-06-24

通常の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専用 シンプルなフィルター
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?