Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

序章 Lune へようこそ

放課後の部室に、こう書いた紙が貼ってあります。

部訓: 必要になるまで、やらない。一度やったことは、忘れない。

楽そうな部だと思って入ったら、これが評価戦略の話だと知らされる —— というのが この言語のリポジトリに書いてある入部初日の風景です。この本は、その続きです。

部室に来られなくても大丈夫なように、教わることを一冊にまとめました。先輩たちは 出てきませんが、彼らの役割は全部コンパイラが持っています。

Lune とは何か — Lazy と Native

名前の由来から。

Lazy は評価戦略のことです。Lune の値は、必要になるまで計算されません。 let と書いた時点では何も起きず、その値を実際に使う瞬間まで待ちます。一度計算したら 覚えていて、二度は計算しません。部訓のとおりです。

Native は……ネイティブコードのことではありません。native language、母語の ことです。Lune のコンパイラは、エラーとその解説を日本語で話します。

$ lune --check guide.lune
error[TYP0001]: 未定義の名前: cont
  --> guide.lune:2:13
  |
2 | let total = cont + 5
  |             ^^^^ この名前は定義されていない
   = hint: もしかして `count` ですか?
   = help: 詳しくは `lune explain TYP0001 --lang ja` を実行してください

英語のエラーメッセージを読み解く労力を、プログラミングそのものを学ぶ労力に回してほしい —— それがこの言語の出発点です。英語で読みたければ --lang en で切り替わります。

この本の態度 — エラーは教材です

部長の台詞をひとつだけ借ります。

うちの部では、エラーは赤点じゃなくて教材。

これは気の利いた言い方ではなく、設計方針です。Lune の診断は、何が起きたか、 どこで起きたか、次に何をすればいいかの3つを必ず持っています。上の例なら、 ^^^^ が場所を、= hint: が次の一手を、= help: がもっと詳しい解説への入口を 示しています。

全31個の診断コードには、それぞれ「意味・再現する最小の例・直し方」の解説が用意されて います。lune explain TYP0001 と打てば読めます。エラー番号は覚えるものではなく、 調べるための鍵です。

だからこの本では、わざとエラーを出します。各章に「壊してみよう」というコーナーが あります。

壊してみよう — REPL で 1 + true と打ってみてください。何が返ってきましたか。

うまくエラーが出たら成功です。エラーが出たら、正解です。

読み方

REPL を開きながら読んでください。 これがいちばん大事なお願いです。

$ lune
Lune v0.1.0 REPL. Type :help or :quit.
lune>

インストールが面倒なら、ブラウザだけで動く Playground があります。処理系が そのままブラウザの中で動くので、何も入れずに始められます。REPL も入っています。

本書に載っている出力は、すべて実際に処理系を動かして採ったものです。同じものが 手元でも出ます。出ないときは、この本が間違っているか、あなたが何か面白いものを 見つけたかのどちらかです。

  • 第I部(第1章) — まず1周。細かい規則は後まわしにして、書いて動かして壊します。
  • 第II部(第2〜10章) — 言語の中身。値と型、関数、遅延評価(第4章)、ADT と match、レコード、null 安全、リストとストリーム、命令的な書き方、モジュール。
  • 第III部(第11〜13章) — コンパイラと道具。診断の読み方、REPL と整形、 そして総合演習のケーススタディ。
  • 付録A〜E — 引くための本。文法、標準ライブラリ、診断コード一覧、CLI/REPL、 そして設計の話。

急いでいる人向けに: 第1章 → 第4章 → 第2・3章 → 第5章 → 第8章 の順でも、 言語の芯には届きます。第4章(遅延評価)はこの言語の看板なので、飛ばさないで ください。:thunks と :trace で、評価が起きる瞬間を自分の目で見ることになります。

演習問題には解答が付いています。各問題の直下に折りたたんで置いてあるので、 考えてから開いてください。

予備知識

何かひとつのプログラミング言語で、変数と関数と条件分岐を書いたことがあれば十分です。 関数型プログラミングの経験は要りません。遅延評価も知らなくて大丈夫です —— むしろ 知らないほうが、第4章は面白いはずです。


それでは、よい部活動を。

まず REPL を開いて、1 + 2 と打ってみてください。第1章はそこから始まります。