はじめに
vibe は WebAssembly にコンパイルされる静的型付け関数型言語で、関数の 署名が「何を受け取り何を返すか」だけでなく「何をしてよいか」まで語ります。
考え方はそれだけで、見た目はこうなります:
fn parse(s: String) -> Intは失敗できず、印字もできず、ディスクにも
触れません。できるなら署名にそう書いてあるはずだからです。
fn parse(s: String) -> Int with Exceptionは失敗しえます。呼び出し側は
処理するか自分も宣言するかのどちらかで、どちらなのかはコンパイラが決めます。
fn main allows Consoleは端末に書き込んでよい。ファイルは読めません。
要求していないからです。
多くの言語では、これらは本体の中にある事実で、注意深く読んで気づくか、 本番で驚かされて知ることになります。vibe ではそれが型にあり、検査され、 そして合成されます。
空の row が約束するのは、ちょうどこの一覧です: ホストの権限(印字・ファイル・
ネットワーク)を使わず、失敗を含む代数的エフェクトを起こさないこと。関数が
引数に触れないことまでは約束しません — fn grow(xs: Array[Int]) -> Unit は
呼び出し側の配列に要素を足せます(ミューテーション に例が
あります)。row のラベル Mut は、それを示す将来の印のために予約されています。
これが嬉しい理由
関数の中身を読まずに何をするか分かる。 row は署名の一部なので、 「これはディスクに書くか」は宣言を見れば答えが出ます。呼び出し先を 全部追う必要はありません。
権限はビルド時に決まり、実行時に祈る対象ではない。 ネットワークを 要求しなかったプログラムはネットワークに到達できず、生成される wasm モジュールは拒否したケーパビリティのコードを含みません。
コンパイラは推測より停止を選ぶ。 診断と黙った誤りの両方がありうる とき、vibe は診断を取ります。しかもメッセージは、あなたのプログラムを 直す編集から始まります。
頭に入る大きさ。 1つの概念に1つの綴り。 cheatsheet が参照先で、この本は そこに理由を書き足したものです。
vibe は wasm にコンパイルされ、自分自身で書かれています — コンパイラは committed seed からビルドされる vibe プログラムなので、vibe をいじるのに 第二のツールチェインは要りません。系譜は Rust / MoonBit / Koka / Verse です。
この本の読み方
最初から順に読んでください。各章は前の章を前提にしています。
インストールと Hello, vibe でツールチェインを 動かし、小さなプログラムではまだ教わって いない機能を使った40行の電卓を読みます — この言語が自分向きかを早めに 判断してもらうための章です。
続く5章が、本書の残り全部を書くための語彙を作ります: 値と関数、制御フロー、
型と文字列、ミューテーション、そして構造体・列挙・match。
エフェクト に必要なのはそれで全部なので、
エフェクトが8章、ケーパビリティ がその次です。
この2章がこの言語の存在理由であり、以降の章はすべてこの2つの上に書かれて
います — Exception はエフェクトなのでレールウェイは row を知ってから
読む方が通りますし、テストは自分が走るケーパビリティを宣言しますし、
並行プログラムは中断するエフェクトです。
残り — レールウェイ、モジュールとテスト、コレクションと反復、 ジェネリクスと等価性、並行処理、wasm 周りのツール — がそれを埋めます。
サンプルコードについて
この本の vibe run ブロックはすべて現行コンパイラで実際にコンパイル・
実行されており、直後の output ブロックはその実行結果そのものです。
言語が変われば、本は黙って古びるのではなくビルドに失敗します。意図的に
実行できない例には理由付きで vibe skip ` が付いています。
この本の記述とコンパイラが食い違ったら、正しいのはコンパイラで、記述の方が バグです — 報告してください。
英語版が原本で、日本語版は同じプログラムを走らせます。コードブロックは 両者で同一で、翻訳されるのは散文だけです。
本のビルドと描画については [book/README.md](../README.md) を参照。