付録C 診断コード一覧
Lune のコンパイラと評価器が発行する診断コードの全一覧です。本書はここで「地図」に徹します
——各コードの詳しい解説(何が起きたか / 再現する最小の例 / 直し方)は本書に写さず、
lune explain CODE(REPL では :explain CODE)に委ねます。同じ内容は
診断カタログ と
documents/ERROR_INDEX_JA.md(英語版は ERROR_INDEX.md)でも読めます。
$ lune explain TYP0007 # 1つのコードを読む
$ lune explain --index # 全コードの詳解を一覧する
コードの頭3文字は族で、そのままコンパイラの検査段階に対応します。族の意味と読み方は 第11章 11.2 節にあります。
「解説のないコードに出会う」ことは起きません。tests/test_explanations.py の
test_every_emitted_code_has_an_explanation が、コンパイラが発行しうる全コードに詳解が
あることを検査しており、詳解を書かずにコードを増やすとテストが落ちるようになっています。
表の読み方
- 本文で触れている章 — そのコードが本文に登場する章です。第11章は診断のしくみそのものを 扱う章なので、ほとんどのコードに触れています。
- 動く例 —
books/examples/にそのコードを実際に再現する検証済みの例がある章です。 「自分で出してみたい」ときの入口として使ってください。—は、本書に狙って出す例を 置いていないコードです(LAY0002やREC0001のように、意図的に出すにはひと工夫要るもの)。 - 警告(
warning)として出るものは意味の欄に「(警告)」と書いてあります。警告は--checkを失敗させません。
一覧
| コード | 分類 | 意味 | 本文で触れている章 | 動く例 |
|---|---|---|---|---|
LAY0001 | レイアウト | インデントが揃っていない | 第 11 章 | — |
LAY0002 | レイアウト | 対応しない閉じ括弧 | 第 11 章 | — |
LXL0001 | 字句 | 予期しない文字 | 第 2、11 章 | 2 |
LXL0002 | 字句 | 文字列・文字リテラルが閉じていない | 第 11 章 | — |
LXL0003 | 字句 | ブロックコメントが閉じていない | 第 11 章 | — |
LXL0004 | 字句 | インデントにタブは使えない | 第 11 章 | — |
MOD0001 | モジュール解決 | モジュールが見つからない・読めない | 第 10、11 章 | 10 |
MOD0002 | モジュール解決 | モジュールの循環 import | 第 10、11 章 | 10 |
MOD0003 | モジュール解決 | module 宣言の不一致 | 第 10、11 章 | 10 |
PRS0001 | 構文解析 | 予期しないトークン | 第 2、6、11 章 | 2 |
PRS0002 | 構文解析 | 特定のトークンが必要 | 第 10、11 章 | — |
REC0001 | レコード検査 | レコードフィールドの重複宣言 | 第 11 章 | — |
REC0002 | レコード検査 | 存在しないレコードフィールド | 第 6、11 章 | 6 |
REC0003 | レコード検査 | レコードフィールドの不足 | 第 6、11 章 | — |
REC0004 | レコード検査 | 初期化でフィールドを二重指定 | 第 6、11 章 | — |
REC0005 | レコード検査 | 宣言されていないフィールドの指定 | 第 6、11 章 | — |
REC0006 | レコード検査 | レコードは名前付きで構築する | 第 6、11、13 章 | — |
RUN0005 | 実行時 | 再帰的なサンク評価 | 第 3、4、10、11、12 章 | 4 |
RUN0006 | 実行時 | 実行時エラー | 第 2、4、6、9、11、12 章 | 4 |
TYP0001 | 型検査 | 未定義の名前 | 第 1、4、10、11、12 章 | 1、4、11 |
TYP0003 | 型検査 | 型の不一致 | 第 1、2、7、8、11、12 章 | 2、7 |
TYP0004 | 型検査 | 呼び出せない値 | 第 3、11 章 | — |
TYP0005 | 型検査 | 引数の個数が違う | 第 1、3、11 章 | 1 |
TYP0006 | 型検査 | for の対象は List でなければならない | 第 9、11 章 | 9 |
TYP0007 | 型検査 | 網羅的でない match | 第 5、7、11、13 章 | 5、7、11 |
TYP0008 | 型検査 | 束縛に反駁可能パターンは使えない | 第 5、9、11 章 | 5 |
TYP0009 | 型検査 | 到達しない match ケース(警告) | 第 5、7、11、12 章 | 5 |
TYP0010 | 型検査 | 引数の型を推論できない(警告) | 第 3、11 章 | — |
TYP0011 | 型検査 | 再帰関数には戻り値型が必要 | 第 2、3、11 章 | 3 |
TYP0012 | 型検査 | ここでは名前付き引数を使えない | 第 11、13 章 | — |
TYP0013 | 型検査 | 不変な束縛への代入 | 第 9、11 章 | 9 |
番号の飛びについて
番号が連番になっていないことに気づいたかもしれません。TYP0002 と RUN0001〜RUN0004
が欠けています。
RUN 系は、設計段階では実行時エラーを種類ごとに分ける予定でした(RUN0004 は
「実行時の非網羅 match」用に用意されていました)。実装ではその方針をやめ、再帰サンクの
force だけを専用の RUN0005 に残して、残りは汎用の RUN0006 に集約しています。
未定義変数も、失敗したサンクの force も、標準ライブラリの型不一致も、実行時の非網羅
match も、みな RUN0006 です。TYP0002 は単なる欠番です。詳しくは
documents/ERROR_DIAGNOSTICS_SPEC.md を参照してください。
欠番を埋め直すことはしません。 一度公開した番号が後から別の意味になるほうが、 飛びがあるより読者にとって害が大きいからです。エラー番号は調べるための鍵であって、 通し番号ではありません。
この付録の出どころ
この表の「コード」「分類」「意味」は documents/ERROR_INDEX_JA.md から作っています。
その索引自体も手書きではなく、コンパイラのカタログから生成されたものです。
$ ./bin/lune explain --index --lang ja > documents/ERROR_INDEX_JA.md
つまりこの表の出どころは lune/explanations_ja.py のカタログであり、コンパイラの実装と
同じ一次情報です。コードを追加・変更したときは、索引を作り直してからこの表を更新してください。