助詞が使えるというのはとても面白いとは思うのだけど、考えればすぐに、述語の目的語を「て・に・を・は」などの助詞だけで受けられないのはわかる。そういう意味でより拡大した意味を持たせて後置詞と呼ぶことにしたのだけど、さらに考えを進めるとすべての後置詞で受けるというのも無理がある。
例えば、扇形の面積を求める述語を考えてみる。扇形の面積を求めるには、中心角、半径が必要になるが、この中心角と半径にはどんな助詞をつけるべきだろうか。いいものが思いつかない。では助詞に限らず後置詞を添えたらいいだろうか。前回説明はしなかったが後置詞の意味は「後ろに置くワード」という意味で使っている。
すぐに思いつくのが、
「Aという中心角、Rという半径の扇形の面積」
という表現だろう。つまり「という中心角」「という半径の」という後置詞を使う方法だ。でもこれだと後置詞という考えに縛られて、日本語としての自然さを犠牲にしてはいないだろうか。間違った日本語ではいないが、「という」という言葉が頻出することに、くどさを感じてしまう。
数学の教科書ではどんな表現を使っていただろう。たしか「中心角A、半径Rの扇形の面積」ではないだろうか。できればこんな形で表現できた方が僕には美しく感じられる。しかしこれだともう後置詞を使ったいままでの構文とは違うものになってしまう。でもこれが実現できるのなら、構文を壊してでもこっちの方がいい。そう思ってしまう。
これを一般化させると、仮引数への代入を述語の呼び出し文に明記できるということになる。でもよく考えてみると、この実引数は式の可能性だってある。こうなると人間はともかくインタプリタが解析するのが一段と難しくなるだろう。思い通りの解釈が無理になるかもしれない。
ならば実引数の部分を括弧で囲んで明確にすればどうだろう。括弧で囲むというのはいいかもしれない。構文的にも今までの規則を拡張して解決できるだろう。
でも式中だと括弧()は優先順位を変える記号として理解できるが、文章中では補足説明的な役割になってしまう。文章表現を中心にするプログラム言語ならば、式以外での()はあまり使わない方がいい。
では角括弧「」はどうだろう。リストを使うのは構文的に楽に組み込める。でも本来のリストとの区別が問題になってくる。リストとワードでは表されるものが大きく違ってしまう。
仮引数名を括弧の前に置くという特異な構文を使うので、別の記号が使えるのならばそのほうがいい。どうせならば専用の括弧が分かりやすいのではないだろうか。中括弧{}はまだ他のことに使っていないから、それにしよう。
結局こうすることにした。
中心角{A}、半径{R}の扇形の面積
そして、仮引数を明示しなくていいときは、仮引数と波括弧を省略できる。つまり、
AにBを足す
のようにできる。
文の構文を考えると、
文
= { 仮引数名 '{' 目的語 '}' 後置詞|',' } 仮引数名 '{' 目的語 '}' 後置詞 述語
| { 目的語 後置詞|',' } 目的語 後置詞 述語
| 述語
内部的には反転させて、次のように処理させる。
文
= 述語 後置詞 '{' 目的語 '}' 仮引数名 { 後置詞|',' '{' 目的語 '}' 仮引数名 }
| 述語 後置詞 目的語 { 後置詞|',' 目的語 }
| 述語
読点'、'はただの区切り記号としていたが、その役割も変える必要がある。このときの読点は並列の記号としてはたらく。つまり、後続する直後の目的語と並列され、そして同じ述語に所属する。その並列している目的語と一緒になって、全体をその後置詞が受けているとみなす。もし後続する目的語の直後に後置詞が無く、かわりに読点がある場合は、同様にして後続の目的語も加えて並列してあるとみなす。必要なだけこれを繰り返す。これができれば自然な文章になるだろう。
「、」に近いが、「と」という演算子も作ろう。これは後置詞のように振る舞う演算子だ。
二項演算子「と」:左右の項をひとつのリストにする演算子。「と」が述語のすぐ左隣の位置にあるときは演算子ではなく、後置詞とみなされる。演算子「と」は記号ではない。したがって「と」に隣接するものは「と」によって分割されることはない。
この二項演算子「と」の存在のために後置詞「と」を右から二番目以降に伴う述語は定義できない。逆に演算子「と」の意味で「と」を使う可能性のある述語は、実引数がリストであるかを判断し、リストであった場合、そのリストの要素を順に処理を行うように手順を記述することになる。
たとえば、「和」という述語がその例になる。この述語は後置詞「の」だけを伴う。実引数がリストの場合は、それらを数値とみなし、その合計を計算する。実引数が数値を表すワードならばそれをそのまま返す。「和」は、自分への引数が演算子「と」によって作られたものであるかは知らない(知れるように細工してもいいが)、そのため演算子「と」を使わずに直にリストの形で引数を与えてもいい。例、「1 2 3 4 5」の和。
今日はここまで。
念のため。これは既存のプログラミング言語を解説したものではなく、作れたらいいなと思っている日本語インタプリタの仕様を夢想する記事。