プログラミング
純粋なSchemeによるWebプログラミングツール
A pure scheme web programming tool (goeteia.dev)
要約
Goeteiaは、純粋なSchemeで記述されたWebプログラミングツールです。コンパイラ自体もSchemeで書かれており、WebAssemblyにコンパイルされてブラウザ上で動作します。自己ホスト型コンパイラ、ネイティブWasm GCオブジェクト、衛生的なマクロ、リアルなクロージャとテイルコール、call/cc、リアクティブなWebスタック、3D/WebGLサポートなどを特徴としています。
全文翻訳
純粋なSchemeで構築
これ以外のすべてはGoeteiaによってレンダリングされます。
以下のSchemeはWebAssemblyにコンパイルされ、ブラウザでマウントされライブ実行されます。
Run
コンパイラを起動中…
サーバーは何もコンパイルしません — このページがコンパイラ全体(Goeteia.wasm、約70KB gzip圧縮、初回ロード後にキャッシュ)を運び、各Runは上記のソースを約15ミリ秒で再コンパイルします。
内容
バイト単位の自己ホスト
コンパイラは、それがコンパイルするSchemeのサブセットで書かれています。自己ホスト型ビルドはそれ自体を再コンパイルし、出力はバイト単位で同一です — 変更のたびにCI方式で固定点がチェックされ、すべてのテストは両方のステージで実行されます。
ネイティブWasm GCオブジェクト
Fixnumsはアンボックスされたi31refs、ペアとレコードはGC構造体、eq?は1つのref.eqです。JavaScriptでのシャドウヒープはありません:ホストは2つのバイトストリームインポートを提供し、それ以外は何も提供しません。
衛生的なマクロ
syntax-rulesと手続き的なsyntax-case(フェンダー、ネストされた楕円、datum->syntax付き)は、衛生によるリネーミングでコンパイル時インタプリタで実行されます。
リアルなクロージャ、リアルなテイルコール
型付けされた関数参照は、高速なパーアリティエントリとクロージャごとの汎用エントリを持ちます — 可変長プロシージャとapplyは安価であり、すべてのテイルコールはreturn_callです。1億回のイテレーションを持つループは、定数スタックで約150ミリ秒で実行されます。
call/cc & dynamic-wind
エスケープ継続はWasm例外処理提案に乗ります:キャプチャはO(1)、通常のパスは1つのtryブロックを要し、ワインダーは終了時に内側から外側へアンワインドします。
リアクティブなWebスタック
細かい粒度の(web reactive)シグナル上の(web sx)テンプレート、(web html)レンダラー、そしてホストに直接到達する(web js)FFI — このページはこれで構築されています。
3DとWebGL
(web three)は、sxがDOMを構築するのと同じ方法でリアクティブなThree.jsシーンを構築します;(web gl)はコマンドバッファを介して生のWebGLを駆動します — フレームごとに1つのブリッジコール — シェーダーは(web glsl)でs式として書かれています。上記のタイトルはまさにこれです:ドットマトリックスグリフ、頂点シェーダー、1つの描画コール。
SchemeからSchemeへ、コーデックなし
バックエンドもScheme(Igropyr)の場合、リクエストと応答はs式です — (rpc "/rpc" '(add 1 2 1/2)) は (ok 7/2) として返され、正確な比率が維持されます。(web fetch)はWasm JSPIを介して直接スタイルにします;(web ws)/(web sse)はデータムストリームをプッシュします;(web json)は他のすべてを処理します。
ライブラリ
R6RSスタイルの(library ...)ファイルで、(import (math utils)) の解決、依存関係が優先されます;未使用コードは anyway で削除されるため、エクスポートは任意です。
クイックスタート
$ git clone https://github.com/guenchi/Goeteia
$ cd Goeteia
$ ./run-tests.sh # すべてのテスト、両方のコンパイラステージ
$ ./build-self.sh # コンパイラをそれ自身で再構築
$ echo '(define (fact n) (if (zero? n) 1 (* n (fact (- n 1))))) (fact 20)' > fact.ss
$ node rt/compile.mjs goeteia.wasm fact.ss fact.wasm
$ node rt/run.mjs fact.wasm 2432902008176640000
コンパイルされたモジュールは、Wasm GCとテイルコールを備えた任意のエンジンで実行できます:Node 22+、現在のChrome / Firefox / Safari、wasmtime。ソースからのブートストラップにはChez Schemeが必要です;チェックインされたコンパイラwasmはそれなしで動作します。