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

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との相互運用も簡単だよ。

Hacker Newsで議論の続きを見る