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

付録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 のカタログであり、コンパイラの実装と 同じ一次情報です。コードを追加・変更したときは、索引を作り直してからこの表を更新してください。