エラーを、ことばにする

よみもの+手を動かす時間:およそ30分

最後の部品は、ことば

前のレッスンで電卓は完成した、と言いました。実は、まだ部品がひとつ欠けています。まちがった入力への、返事です。

正しい入力を正しく計算する言語は、半分しかできていません。使う人は必ずまちがえるからです。そしてまちがえた瞬間に返ってくることばが、その言語の印象——いわば人格——を決めます。

悪い返事と、良い返事

同じまちがいに対する、3通りの返事を見てください。

  1. syntax error
  2. unexpected token ')'
  3. ( が ) で閉じられていません。——3文字目を指しながら

1は「まちがいがある」としか言っていません。2は「何が来たか」までは言っています。3はどこで・何に困ったかを言い、しかも入力した人のことばで言っています。

良いエラーは、3つの問いに答えます。どこで困ったか。何を期待していたか。かわりに何が来たか。 道を聞かれて「ちがいます」とだけ答える人と、「その角を曲がるはずが、まっすぐ行きましたね」と答える人のちがいです。

あなたの言語の返事を、聞いてまわる

実験室で、わざとまちがえてみてください。この言語がどう返事するか、いくつか集めてみましょう。1 +(途中で終わる)、(1 + 2(閉じ忘れ)、10 / 01 @ 2

③ 評価された値

式の途中で、コードが終わってしまいました。ここには数が入ります。

どの返事も、困った場所理由を言っていることを確かめてください。レッスン1でやった「工程あてクイズ」を思い出すと、返事の出どころ(①粒に分ける ②木にする ③意味にする)も聞き分けられるはずです。

エラーは、案内にもなれる

もうひとつ、この言語の変わった返事を聞いてみましょう。3 < 5 と打ってみてください。

「この章では、まだ『<』は登場していません」——ただ断るのではなく、この先に何があるかを案内しています。エラーは「行き止まり」の札ではなく、「この道はまだ工事中です。開通をお楽しみに」の札にもなれる。何を言って断るかも、設計です。

よりみち:エラーメッセージの名文家たち

プログラミング言語Elmは「エラーメッセージの良さ」で歴史に名を残しました。まちがいの場所を図示し、原因の候補を挙げ、直しかたまで提案する。Rustもその系譜です。「エラーが親切な言語は学びやすい」——当たり前に聞こえますが、業界がそこに本気になったのは、実はこの10年ほどのことです。

返事を書く側の、たった2つの道具

では、誠実な返事はどう実装するのでしょう。道具は2つだけです。

JavaScript
// 道具1: エラーに「位置」を持たせる
// 道具2: 期待と現実を、ことばにする
const source = "(1 + 2";

function reportError(position, expected, found) {
  console.log(source);
  console.log(" ".repeat(position) + "^");
  console.log(position + "文字目: " + expected + "はずが、" + found);
}

reportError(0, "( が ) で閉じられる", "コードが終わってしまいました");

Ctrl+Enter でも実行できます

ポイントは1行目のコメントにある「位置」です。この言語の処理系は、粒に分ける段階から、すべての粒に「何文字目から何文字目か」のメモを貼って運んでいます。だから困った瞬間に、困った場所を指させる。親切は、仕組みの最初から仕込んでおくものなのです。

誰に向かって書くか

エラーメッセージには読み手がいます。unexpected token と書くとき、読み手は英語とコンピュータ用語を知る人に限られます。この庭の言語が日本語で返事をするのは、読み手を最初の学習者に決めたからです。

これはコース1のレッスン9で、あなたが英語のエラーを読む側として苦労したことの、裏返しです。あのとき欲しかった返事を、いま、あなたが書く側になって設計しています。

演習:返事の品評会

次の3つは、どれも「未定義の名前 hana を使った」ことへの返事です。それぞれの返事が3つの問い(どこで・何を期待・何が来た)のどれに答えていて、どれに答えていないか、品評してください。 (あ)Error: undefined variable (い)hana is not defined (う)「hana」という名前を、まだ知りません。先に「hana = 値」と書いてください。

ヒント1(考え方)

「名前を出しているか」「場所を指せるか」「次の一歩を示しているか」の3点で見ると、差がはっきりします。

こたえ(の一例)

(あ)は何も特定していません。(い)は「何が来たか」(hanaという名前)に答えていますが、次の一歩がありません。(う)は名前・理由・次の一歩まで答えています——ただし(う)にも改善の余地はあります。たとえば「何行目か」を言っていません。

完璧な返事はありません。あなたが「自分ならこう書く」と思えたなら、それがこのレッスンの成果です。

このレッスンで分かったこと

  • エラーメッセージは言語の人格。まちがいへの返事までが言語の設計
  • 良い返事は3つの問いに答える:どこで・何を期待して・何が来たか
  • 実装の鍵は、粒の段階から位置のメモを持ち運ぶこと
  • エラーには読み手がいる。誰に向かって書くかを決めるのも、設計者の仕事