PaPoo
cover
technews
Author
technews
世界の技術ニュースをリアルタイムでキャッチし、日本語でわかりやすく発信。AI・半導体・スタートアップから規制動向まで、グローバルテックシーンの「今」をお届けします。

ClojureScript 1.12.145 リリースで「async function」対応が来た

キーポイント

ついにClojureScriptでも「async/await」が本格的に使いやすくなった

ClojureScriptの新しいリリース、​1.12.145 が公開されました。
日付は 2026年5月7日。今回の発表でいちばん目を引くのは、やはり async functions 対応です。

ざっくり言うと、ClojureScriptで ^:async というヒントを付けると、コンパイラが JavaScript の async function を出力してくれるようになりました。
これ、地味に見えてかなり大きいです。今どきのJavaScript界隈は Promiseasync/await が当たり前なので、そこに素直に乗れるのはとても実用的だと思います。

^:async で何が変わるのか

元記事にある例では、こんなコードが紹介されています。

(refer-global :only '[Promise])

(defn ^:async foo [n]
  (let [x (await (Promise/resolve 10))
        y (let [y (await (Promise/resolve 20))]
            (inc y))
        ;; not async
        f (fn [] 20)]
    (+ n x y (f))))

ここでやっていることは難しく見えるかもしれませんが、要するに:

という流れです。

つまり、​ClojureScriptのコードの書き味を保ちながら、JavaScriptの非同期処理に自然に対応できるわけです。
個人的には、これはかなりうれしい改善だと思います。というのも、ClojureScriptは「Clojureっぽく書ける」のが魅力ですが、現実のWeb開発では結局ブラウザAPIや外部ライブラリとの接続が必要になります。そこで Promiseasync/await が素直に扱えるのは、毎日の開発体験に効いてきます。

テストでも async が使える

今回の対応は、実装コードだけではありません。テストでも使えます。

(deftest ^:async defn-test
  (try
    (let [v (await (foo 10))]
      (is (= 61 v)))
    (let [v (await (apply foo [10]))]
      (is (= 61 v)))
    (catch :default _ (is false))))

これにより、非同期関数のテストをかなり自然に書けます。
非同期処理のテストって、どうしても「待つ」「例外処理する」「結果を確認する」が絡んで少し面倒になりがちです。そこが言語機能として整理されるのはありがたいですね。

なぜこれが重要なのか

元記事では、この機能は「JavaScript interop」の改善として大きな意味があると説明されています。
ここでいう interop は、簡単に言えば「別の言語や仕組みとつなぐこと」です。今回は ClojureScript と JavaScript の接続ですね。

特に重要なのは、​追加の依存ライブラリを入れなくても済むケースが増えることです。
ブラウザの最新APIや人気ライブラリは、Promise ベースで動くものが多いので、それに対してわざわざラッパーや補助ライブラリを足さずに済むのはかなり楽です。

元記事によると、前回のClojure surveyでも async functions のサポートは、JavaScript interop の改善要望の中で特に支持が強かったとのこと。
これは納得感があります。実際、現場では「同期っぽく見えるけど中身は非同期」という処理が山ほどありますからね。そこに素直に対応できるかどうかは、言語の使いやすさをかなり左右します。

とはいえ、何でも魔法みたいに解決するわけではない

ここは少し冷静に見ておきたいところです。
^:async が便利なのは間違いないですが、非同期処理そのものが簡単になるわけではありません。ネットワーク遅延、失敗、キャンセル、順序制御など、面倒な問題は当然残ります。

ただ、その「面倒な現実」を扱うための書き方が、JavaScriptの世界により自然に近づいたのは大きいです。
ClojureScriptの魅力は、ただ独特な言語というだけでなく、​JavaScript世界と無理なく付き合えることにもあるので、今回の改善はかなり筋がいいと思います。

まとめ

ClojureScript 1.12.145 は、派手な機能追加というより、​実戦で効く改善が中心のリリースです。
中でも ^:async による async function 対応は、現代のWeb開発にかなり刺さるアップデートだと思います。

ClojureScriptを使っている人にとっては、かなりチェックしておきたいリリースではないでしょうか。


参考: ClojureScript - 1.12.145 Release

同じ著者の記事