序章 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章はそこから始まります。