
2026/01/18 6:23
WebRacket は、WebAssembly にコンパイルされる Racket のサブセット言語です。
RSS: https://news.ycombinator.com/rss
要約▶
日本語訳
WebRacket は、ソースコードを WebAssembly (Wasm) にコンパイルしてブラウザ上で直接実行できるようにする Racket の実験的サブセットです。Node.js を介したターミナルサポートも備えています。
現在は基本的な数値型(flonums と fixnums)のみをサポートしており、複素数、bignum、正規表現、および多くの Racket 構文形態(例:不変ハッシュテーブル)などの高度な機能はありません。
コンパイラは direct‑style アプローチを採用しており、継続と継続マークを扱うために continuation‑passing style (CPS) パスが今後追加されます。そのパイプラインには unexpand、parse、flatten‑topbegin、infer‑names、explicit‑begin、closure‑conversion、および generate‑code などのパスがあり、S‑expression Wasm を生成し、
wasm-tools がそれをバイトコードに変換します。ランタイムは WebAssembly ランタイムファイル(
runtime-wasm.rkt)と JavaScript アセンブラ(assembler.rkt)に分割されています。インストールには、Wasm ツールチェーンユーティリティ(≥ 1.243.0)、
--experimental-wasm-exnref を有効にした Node.js、Racket 9+、および raco‑static-web パッケージが必要です。JavaScript FFI により、WebRacket は標準の JS 関数やブラウザ API(DOM、Canvas、MathJax、XTermJS、JSXGraph)をプロジェクトに含まれるバインディング経由で呼び出すことができます。
サンプルプロジェクトは、その機能を示しています:MathJax エディタ、xterm.js を使用した Matrix‑rain アニメーション、MiniScheme REPL、pict グラフィックスライブラリのポート、Space Invaders キャンバスゲーム、および xterm.js ターミナルエミュレータです。
今後の作業には、linklets によるモジュールサポート、複素数・bignum・正規表現の完全サポート、 impersonators/chaperones(契約用)の実装、および継続マークの完全対応が含まれます。
Wasm を介して Racket コードをブラウザで実行できるようにすることで、WebRacket は広範な Racket コミュニティにウェブベースのデプロイメントを試す機会を提供し、標準 Racket コンパイラにおける Wasm バックエンドの可能性への道を開きます。
本文
WebRacket
WebRacket は Racket のサブセットで、WebAssembly(wasm)へコンパイルされます。
長期的には完全な Racket サポートを目指しつつ、現在は実用的な Web アプリケーションを作成するのに十分な機能を提供しています。
コア機能
- ターゲット – Chrome, Firefox, Safari(WebAssembly の幅広いサポートがある機能のみ)
- 実行環境 – Node でターミナルから、またはブラウザ上(主にブラウザ)
- FFI – JavaScript FFI により標準 JS 関数やブラウザ API を利用可能。DOM, Canvas, MathJax, XTermJS, JSXGraph のバインディングが含まれています。
対応言語サブセット
| カテゴリ | ステータス |
|---|---|
| データ型 | 数値は flonum と fixnum のみ(複素数・ビッグナンバー未対応)。 ハッシュテーブル:可変(eq?、eqv?、equal? サポート)で不変はまだ。 |
| 正規表現 | 直接サポートされていません。 |
| ポート | ブラウザターゲットでは文字列ポートとバイトストリングポートのみ。 |
| 構造体 | 多くの機能が利用可能ですが、プリファブ構造体は未実装。 |
| 構文形式 | 標準 Racket エクスパンダーを使用し、, などが含まれます。除外項目: , , 。 |
| 制御フロー | タイルコール、複数値、上流例外はサポート済み。 継続( )、継続マーク、プロミス、break, exit, black box などは未対応。 |
| 並行性 | 現在はシングルスレッドです。 |
外部関数インタフェース (FFI)
- JavaScript FFI によりブラウザ機能へアクセスできます。
- 現在のバインディング:Math, DOM, Canvas, MathJax, XTermJS, JSXGraph。
今後のロードマップ
- 早期採用者のバグを修正。
- モジュールサポート(リンクレット進行中)を追加。
- 複素数とビッグナンバーをできるだけ早く導入。
- コントラクト用のインパーソネータ/チャプロンを実装。
- リンクレットで完全な正規表現実装を解放。
- 継続・継続マーク(可能なら CPS パス)に対処。
インストール(短縮版)
必要なのは次のとおりです:
(Bytecode Alliance, v1.243.0+)wasm-tools- Node.js(最新版。
をサポート)--experimental-wasm-exnref - Racket 9.0
raco-static-web- WebRacket リポジトリをクローン
wasm-tools の設定
# ダウンロード&展開 wget https://github.com/bytecodealliance/wasm-tools/releases/download/v1.243.0/wasm-tools-1.243.0-aarch64-macos.tar.gz tar -xvf wasm-tools-1.243.0-aarch64-macos.tar.gz # PATH へ追加(macOS の例) sudo mv wasm-tools /usr/local/bin/
確認:
wasm-tools --version
Node.js
https://nodejs.org からダウンロードしてインストール。
検証:
node --experimental-wasm-exnref --expose-gc # Node プロンプトが表示されれば OK
Racket と raco-static-web
raco pkg install raco-static-web
HTML ファイルを置いたフォルダで Web サーバーをテスト:
raco static-web # http://localhost:8000/ をブラウザで開く
コンパイラ概要
-
スタイル – 直接スタイル(まだ CPS パスは実装されていません)。
-
フロントエンド –
→ Racket エクスパンダー。read-syntax -
ミドルエンド – NanoPass フレームワークによる一連のパス:
unexpand → parse → flatten-topbegin → infer-names → convert-quotations → explicit-begin → explicit-case-lambda → α-rename → assignment-conversion → categorize-applications → anormalize → closure-conversion → flatten-begin → (classify-variables) → generate-code -
コードジェネレータ – “folded” フォーマットで WebAssembly S‑式を出力。
-
ランタイム –
(WebAssembly 側)、runtime-wasm.rkt
(JS ランタイム)。assembler.rkt -
ライブラリ – 標準ライブラリは
、FFI バインディングはstdlib/
に格納。ffi/
例
| 例 | 説明 |
|---|---|
| MathJax 4 を使った二画面エディタ/プレビュー。 |
| XTermJS で実装したデジタルレイン効果。 |
| xterm.js ベースの対話型 Scheme REPL。 |
| picture ライブラリを移植。 |
| キーボードとアニメーションループを使った 2D canvas 上のクラシックゲーム。 |
| XTermJS ホームページからインタラクティブ端末を再現。 |
実行方法
cd examples/ raco static-web # ローカル Web サーバー起動 # http://localhost:8000/ を開き、目的の例へ移動
まとめ
WebRacket はブラウザ上で Racket に似た体験を提供し、JavaScript FFI を通じて WebAssembly へコンパイルします。モジュールや継続、正規表現など一部機能は未実装ですが、現在のサブセットでも生き生きとした Web アプリケーションを構築することが可能です。