世界を動かす技術を、日本語で。

ClojureScriptにAsync/Awaitが追加される

概要

  • ClojureScript の新バージョンリリース発表
  • Async関数 サポートの追加
  • ECMAScript 2016 ターゲットによる新機能強化
  • JavaScriptとのインタープリティビリティ 向上
  • コミュニティ貢献者 への謝辞

ClojureScript 1.12.145 新リリースのお知らせ

  • ClojureScript Team による2026年5月7日付リリース
  • 既存ユーザー向けに リリースノート の熟読推奨
  • ECMAScript 2016 をターゲットとしたことで、今後も新機能追加予定

Async関数サポート

  • 関数に ^:async ヒントを付与することで、 JavaScriptのasync関数 として出力
    • 例:
      (defn ^:async foo [n]
        (let [x (await (Promise/resolve 10))
              y (let [y (await (Promise/resolve 20))] (inc y))
              f (fn [] 20)]
          (+ n x y (f))))
      
  • テスト関数 にも^: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))))
      
  • 最新のClojure調査で JavaScript interop向けasync関数サポート が最も要望された機能
  • 追加依存なし でモダンなブラウザAPIやライブラリとの連携が容易に

その他の修正・変更点

  • ClojureScriptの全修正・変更・強化点一覧 は公式ページ参照

コミュニティへの感謝

  • ClojureScript 1.12.145 への貢献者として Michiel Borkent 氏ほかコミュニティメンバーに感謝

Hackerたちの意見

面白い事実だけど、ClojureScriptはcore.asyncライブラリ(CSPスタイル)を通じて非同期パラダイムをサポートしてたんだよね。async/awaitがJavaScriptに登場するずっと前にね。編集:このリリースの価値を下げようとしてるわけじゃないよ。ただ、ライブラリを依存関係に追加するだけでホスト言語にない新しい言語機能が使えるのってすごいなって思っただけ。Clojureは最高だね!

確かにそうだけど、特に2026年にはcore.asyncを避ける理由がたくさんあるよ。Jsのアーティファクトが膨れ上がるし、固有のエラーモデルがないし、何か問題が起きたときに読みづらい・デバッグしづらい状態遷移コードに変わっちゃう。さらに、goマクロは大きすぎる関数を促進しちゃうから、自分のsexprの外のコードを変換できないんだよね。Cognitectの誰かが言ったように、「core.asyncは美しいナンセンス」。

面白い事実: clojurescriptは、async/awaitがJavaScriptに登場するずっと前からcore.asyncライブラリ(CSPスタイル)を通じて非同期パラダイムをサポートしてたよ。確かに。俺はそれを多用してたし、ちゃんと動いてた。ちょっとした癖はあったけど、10年以上前からasync/awaitは使ってたと思う。David Nolenのトークを見てから知ったんだ。それ以来、フロントエンドではミニマルなJavaScriptに移行したよ。SSEは一方向で、それが美しい。今、多くの異なる言語の開発者がSSEに興味を持ってるのを見るのが嬉しい。David Nolenの「A ClojureScript Survival Kit」っていう最近の素晴らしいトークがあるよ: https://youtu.be/BeE00vGC36E ClojureScript(とcore.async)の立ち上げ以来の彼の仕事には本当に感謝してる。「Swannodette」NolenがClojureScriptを使わずに純粋なClojure(サーバーサイド)とサーバーサイドイベントを使うアイデアに興奮してるのがすごい。実際のデモは26:30あたりから始まるよ。クライアントで動いてるWebアプリがどれだけリソースを使ってるかを見せて、その後サーバーで動いてる同じWebアプリをSSEを使ってクライアントに一方向でプッシュする様子を見せるんだ。すごいよね、リソースの使用量がほぼゼロに近くなる。人によって違うかもしれないけど、ミニマルなDOMモーフィングライブラリを使うようになってから、Webアプリの状態を考えるのが楽になった。以前はClojure用とClojureScript用の2つのREPLがあって、行き来が多くて状態を追跡するのが大変だったけど、今は全てが確実にスナッピーで再現が楽になった。SSEが全てのケースでうまくいくとは言わないけどね。とにかく、動画や少なくとも26:30からのデモは見る価値があるよ。

しばらくはこの記事がCoffeeScriptについてだと思ってた…でも、もうasync/awaitをサポートしてるんだね :)

やっとこの10年以上頭の中に住んでた小さな脳の虫を使えるようになったよ:IcedCoffeeScriptはずっと前から存在してたんだ。https://maxtaco.github.io/coffee-script/ ESがそれを取り入れるずっと前からね。

フロントエンドにJSの代わりになるものが流行って、もっと一般的になってほしいな…ClojureScriptみたいなものを使いたいけど、個人のサイドプロジェクト以外で使うのは想像しづらい :/ もしバックエンドでClojureを使ってるなら、採用しやすいのかな?

Gleamを試してみて!今、プロダクションで使っててすごく満足してるよ:https://blisswriter.app/ https://blog.nestful.app/p/how-we-dropped-vue-for-gleam-and

恐れないで、すごくいいよ!「マイナー」なんて呼ぶつもりは全然ないし、10年間使ってきたけど、複雑なアプリを高最適化のクライアントサイドコードにコンパイルするのに役立ってる。コミュニティもとても歓迎してくれて成熟してるよ。

https://www.scala-js.org/ は本当にすごいよ。

https://hypermedia.systems/ を読んだ後、最良のフロントエンドはフロントエンドがないことだと結論に至ったよ。

もしかしたら、JSの上に構築されたSmalltalkであるSmallJSがあるかも。ブラウザやNode.jsで動かせて、async-awaitも使えるよ。:-) : https://small-js.org

Mint(https://mint-lang.com)をチェックしてみて。すべてが組み込まれている言語で、小規模から中規模のプロジェクトはサードパーティの依存関係なしで作れるし、JSとの相互運用も簡単だよ。

メインストリームの言語じゃないから、同僚が知らないかもしれないって心配してるの?それとも、言語自体が放置されたり、悪くなることを心配してるの?実際には使ったことはないけど、いくつかサイドプロジェクトや家族のために作ったことはあるよ。ClojureScriptのReactラッパーであるReagentは、正直Reactよりも理解しやすい。HTMLを生成するのにHiccupを使って、コンポーネントはHiccupのDSL(実際にはリスト)内の関数に過ぎないから、すごくクリーンに見える。静的なものは静的に見えるし、動的なものは明らかにそうだし、普通のReactよりも魔法感が少なかった。悪いと感じたのは、NPMで見つけた非関数型コンポーネントを使おうとした時だけ。致命的ではないけど、コードが見栄え悪かった。ラッパーで直せないわけじゃないけど、いくつかのJSライブラリはcljsではデフォルトでひどく見える。

10年前、仕事でフロントエンドにClojureScriptを書いてたんだ。Clojureのショップじゃなかったけどね。当時のマネージャーが言ってたけど、ClojureScriptを選ぶのは採用基準の一部だったんだ。関数型プログラミングに興味がない人は、あまり良いプログラマーじゃない傾向があったから、そういう人を避けてたんだ。

async/await関数をCSPでラップする方が、これを扱うには良い方法だったみたいだね。Clojureはこれに対してもっと良いパターンを持ってたし。

このリリースはホスト言語のプリミティブをClojureScriptに公開することについてだよ。core.asyncはなくならないし、async/awaitがPromiseベースの実装よりも良く機能するなら、core.asyncの.cljs部分もアップデートされるよ。

まだできるよ、ClojureScriptの世界では何年も前からできてたし、結局はただのPromiseだから!この新しい関数ヒントでそれがなくなるとは思えないよ。https://clojurescript.org/guides/promise-interop#using-promi...

いいね!それじゃあ、部屋の中の象も消しちゃおうぜ - 「Google Closure Compiler」もなくなれば、本当にお祝いできるね。

それって、みんながなくしたいと思ってることなの?俺がClojureScriptやってた頃は、自動で使えることを誇りに思ってた人が多かったけど。どうやって同じメリットを得るつもりなの?それとも、15年経ってもそのメリットは大したことないっていう主張なの?

これは、追加のライブラリを入れずにJavaScriptの相互運用性を実現するために重要だよ。めっちゃクールだし、長い間待ってた!リリースおめでとう! :-)

すごいね、ありがとう!リリースおめでとう!今はClojure/Scriptを始めるには最高のタイミングだと思うけど、まあ…実はずっとそうだったよね!

急にClojure/ClojureScriptがSNSでよく見かけるようになって驚いてる。2012年頃に数年間プロで使ってたけど、他の多くの人と同じようにJVMから移って、型付きの[関数型]言語に移行したんだ。突然の盛り上がりはエージェント的なコーディングのおかげ?型チェックがなくて、無効な構文エラーや予約語に悩まされずにコードを早く書けるから?セクスプの復活が来るのかな?

エージェント的なコーディングと相性がいいもう一つの特徴はREPL駆動の開発だね。なぜそのアプローチが理論的にサポートできる他の言語で広まってないのか不思議だな。

エージェントコーディングでいろんな言語を使ってコーディングしてるんだけど、型付き言語の方が全然パフォーマンスがいいんだよね。基本的にエージェントがハルシネーションエラーを起こしたら修正してくれるから、特に大規模なリファクタリングの時に助かる。大型の型なしPythonコードベースを扱ってるけど、AIと一緒だとテストがないと本当に面倒くさい。何も壊れてないか確認するのが大変なんだよね。型システムが強いほどいいよ。あと、AIモデルはコードでトレーニングされてるから、人気のある言語ほどAIのパフォーマンスも良くなる。ClojureScriptはいいけど、メジャーな言語じゃないから、JavaScriptに比べるとAIのパフォーマンスは落ちると思う。結局、AIを使うなら型付き言語か、型ヒントのある動的言語を選んだ方がいいよ。

個人的には、10年前に型付き関数型言語からClojureScript、そしてClojureに移ったんだ。知ってる限り、真剣なClojureコードベースはテストスイートにかなり投資してるから、AIにテストスイートの効果的な使い方を教えるスキルを追加すれば、すぐに使えるようになるよ。うちの同僚の中にはエージェントをREPLとやり取りさせてる人もいて、エージェントが毎回のやり取りでスタートアップコストを払わなくて済むから、パフォーマンスが速くなるって言ってた。私はそこまでやるのが面倒で、十分速いからそのままなんだけど。Clojureは邪魔になるものが少ないって言ってたけど、確かにその通りで、真実はfalseとnil以外の全てだし、言語には優先順位のテーブルもない。コア言語はデフォルトで不変で永続的なデータ構造をサポートしてる。全てが式で、演算子と式の混合はない。map、reduce、filterは組み込みで、普通のコードでは期待されるものだよ。10年前に書いたClojureのコードは、今でも動く可能性が高い。エコシステムや言語の作者は壊れるコードをタブー視してるからね。私が使った言語の中で、最も頭が痛くならず、アイデアを表現するのが自由で楽しい言語だよ。それに、デファクトスタンダードのリバースデバッガーFlowstormはプログラミングの夢だね。満足したいなら、素晴らしい言語だよ。でも、そのせいで多くのユーザーはそれを当たり前に思ってあまり話さないんだよね。理解していない商業的なClojureプログラマーも多くて、結果的にあまり幸せじゃない人もいる。彼らは選んだわけじゃなくて、たぶん準備ができてないんだと思う。多くのClojureユーザーは、使う前に他の言語で嫌だなと思ったことを10年かけて気づいてるべきだね。ClojureのクリエイターRich Hickeyはソフトウェアに関する影響力のある動画をたくさん出してるけど、同僚がそれを見てるかどうかはわからないし、興味があるかもわからない。

なんかドキュメンタリーが出たか発表されたかした気がするけど、それに関係あるのかな?

10年前、JavaScriptにAsync/Awaitが追加されたのを覚えてる。10年って結構長いよね。

Clojure/Lispの魅力は、素晴らしいマクロシステムがあることだよね。これまでの間に、人々は自分たちのマクロを作ってasync/awaitをシミュレートしてきた。これがLispの強力な機能で、公式のリリースを待たなくても、自分でその機能を言語に追加できるんだ。今はそのカスタムマクロを使わなくてもよくなったから、基本的には同じことをしてたんだけどね。

Clojurescriptはすでにそれを持ってたけど、ネイティブのasyncは使ってなかったんだよね。

cljsにとっては素晴らしい勝利だね、おめでとう!