^:async を付けると JavaScript の async function を生成できることawait を使って、PromiseベースのAPIをかなり自然に扱えるようになった^:async が使えるので、非同期処理のテストが書きやすくなるClojureScriptの新しいリリース、1.12.145 が公開されました。
日付は 2026年5月7日。今回の発表でいちばん目を引くのは、やはり async functions 対応です。
ざっくり言うと、ClojureScriptで ^:async というヒントを付けると、コンパイラが JavaScript の async function を出力してくれるようになりました。
これ、地味に見えてかなり大きいです。今どきのJavaScript界隈は Promise と async/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))))
ここでやっていることは難しく見えるかもしれませんが、要するに:
Promise/resolve で即座に値を返す Promise を作るawait でその結果を待つf は async にしないまま使うという流れです。
つまり、ClojureScriptのコードの書き味を保ちながら、JavaScriptの非同期処理に自然に対応できるわけです。
個人的には、これはかなりうれしい改善だと思います。というのも、ClojureScriptは「Clojureっぽく書ける」のが魅力ですが、現実のWeb開発では結局ブラウザAPIや外部ライブラリとの接続が必要になります。そこで Promise や async/await が素直に扱えるのは、毎日の開発体験に効いてきます。
今回の対応は、実装コードだけではありません。テストでも使えます。
(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開発にかなり刺さるアップデートだと思います。
Promise ベースのAPIを自然に扱えるawait を使ったコードが書きやすいClojureScriptを使っている人にとっては、かなりチェックしておきたいリリースではないでしょうか。