エラーを、ことばにする
最後の部品は、ことば
前のレッスンで電卓は完成した、と言いました。実は、まだ部品がひとつ欠けています。まちがった入力への、返事です。
正しい入力を正しく計算する言語は、半分しかできていません。使う人は必ずまちがえるからです。そしてまちがえた瞬間に返ってくることばが、その言語の印象——いわば人格——を決めます。
悪い返事と、良い返事
同じまちがいに対する、3通りの返事を見てください。
syntax errorunexpected token ')'( が ) で閉じられていません。——3文字目を指しながら
1は「まちがいがある」としか言っていません。2は「何が来たか」までは言っています。3はどこで・何に困ったかを言い、しかも入力した人のことばで言っています。
良いエラーは、3つの問いに答えます。どこで困ったか。何を期待していたか。かわりに何が来たか。 道を聞かれて「ちがいます」とだけ答える人と、「その角を曲がるはずが、まっすぐ行きましたね」と答える人のちがいです。
あなたの言語の返事を、聞いてまわる
実験室で、わざとまちがえてみてください。この言語がどう返事するか、いくつか集めてみましょう。1 +(途中で終わる)、(1 + 2(閉じ忘れ)、10 / 0、1 @ 2。
式の途中で、コードが終わってしまいました。ここには数が入ります。
どの返事も、困った場所と理由を言っていることを確かめてください。レッスン1でやった「工程あてクイズ」を思い出すと、返事の出どころ(①粒に分ける ②木にする ③意味にする)も聞き分けられるはずです。
エラーは、案内にもなれる
もうひとつ、この言語の変わった返事を聞いてみましょう。3 < 5 と打ってみてください。
「この章では、まだ『<』は登場していません」——ただ断るのではなく、この先に何があるかを案内しています。エラーは「行き止まり」の札ではなく、「この道はまだ工事中です。開通をお楽しみに」の札にもなれる。何を言って断るかも、設計です。
⟡ よりみち:エラーメッセージの名文家たち
プログラミング言語Elmは「エラーメッセージの良さ」で歴史に名を残しました。まちがいの場所を図示し、原因の候補を挙げ、直しかたまで提案する。Rustもその系譜です。「エラーが親切な言語は学びやすい」——当たり前に聞こえますが、業界がそこに本気になったのは、実はこの10年ほどのことです。
返事を書く側の、たった2つの道具
では、誠実な返事はどう実装するのでしょう。道具は2つだけです。
// 道具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つの問いに答える:どこで・何を期待して・何が来たか
- 実装の鍵は、粒の段階から位置のメモを持ち運ぶこと
- エラーには読み手がいる。誰に向かって書くかを決めるのも、設計者の仕事