かけ算と、優先順位のなぞ
7か、9か
小学校で習った決まりがあります。「かけ算は、たし算より先」。だから 1 + 2 × 3 は 7。
でも、立ち止まってください。コンピュータは小学校に行っていません。「先に計算する」を、文字も計算もしらみつぶしに処理する機械に、どう教えればよいのでしょう。今日はこのなぞを解いて、電卓を完成させます。
- 式たす +
- 数1
- 式かける ×
- 数2
- 数3
答えは、木のかたちにある
②の欄を見てください。× が、+ より深いところにいます。
前のレッスンで「木は深い葉っぱから固まる」と学びました。つまり——深いものが先に計算される。「かけ算が先」を機械に教えるとは、「かけ算が木の深いところに来るように木を組む」ということだったのです。優先順位は計算のルールではなく、木の組みかたのルールでした。
確かめましょう。実験室で (1 + 2) * 3 に書きかえてください。かっこをつけると、今度は + が深いところへ移り、答えは 9 になります。かっこの正体は、「ここを先に固めて」という、木の組みかえ指示です。
文法に、階層を書く
では、木を組む側(工程②)は、どうやって × を深くするのか。種明かしは、文法の書きかたにあります。この電卓の文法は、実はこういう3階建てになっています。
式 = 項 が「+」「-」でつながったもの項 = 因子 が「×」「÷」でつながったもの因子= 数、または「( 式 )」読みかたのコツは「式は項でできていて、項は因子でできている」というmaterial(材料)の階層です。パーサ(工程②のプログラム)は、この3行をほぼそのまま関数3つに写して作ります。「式を読む関数」は「項を読む関数」を呼び、「項を読む関数」は「因子を読む関数」を呼ぶ。
材料の階層が深いほど、木の深いところで固まる。× は「項」の階層——「式」より一段深い——にいるから、自然と木の深い場所に組まれる。文法の階層が、そのまま優先順位になる。これが今日のなぞの、最後の答えです。
⟡ よりみち:「+を先」の言語を作ってもいい
3階建ての文法で「+」と「×」の階層を入れかえれば、「たし算が先」の言語が本当に作れます。誰も使ってくれないかもしれませんが、動きます。「かけ算が先」は宇宙の法則ではなく、人間の慣習を文法に写しただけ——規則は、設計の選択なのです。ちなみにAPLという実在の言語は、優先順位を捨てて「右から順に計算」を選びました。
電卓、完成
数・たし算ひき算・かけ算わり算・かっこ。あなたの言語は、電卓として完成しました。
レッスン1でこう言いました。「電卓と本物の言語のちがいは語彙の量だけ」。その意味が、いまは実感できるはずです。文法に1行足し、評価器に1行足せば、語彙はひとつ増える。この足し算を繰り返した先に、変数があり、もしもがあり、関数があり——にわ語があります。
✎ 演習:木のかたちを、先に言い当てる
実験室に打ちこむ前に、次の3つの式の「木のかたち」と「値」を予想してください。それから確かめてください。
(あ)2 * 3 + 4 * 5 (い)100 / 10 / 2 (う)2 * (3 + 4) * 5
- 式たす +
- 式かける ×
- 数2
- 数3
- 式かける ×
- 数4
- 数5
- 式かける ×
ヒント1(考え方)
いちばん上(根もと)に来るのは、いちばんあとに計算されるもの。つまり、いちばん階層の浅い演算子です。(い)は前レッスンの「左結合」を思い出してください。
こたえ
(あ)根もとは+、左右にそれぞれ×のまとまり。値は26。(い)左に深い木で (100/10)/2 = 5。もし右結合なら20でした。(う)かっこが3+4を先に固め、(2×7)×5 = 70。
3つとも木のかたちが言えたなら、あなたはもう、式を「文字の列」ではなく「構造」で見ています。それは言語を作る人の目です。
このレッスンで分かったこと
- 優先順位の正体は木のかたち。深いものが先に計算される
- かっこは「ここを先に固めて」という木の組みかえ指示
- 文法を階層(式>項>因子)で書くと、階層がそのまま優先順位になる
- 規則は設計の選択。「+が先」の言語も、作ろうと思えば作れる