これは既存のプログラミング言語を解説したものではなく、作れたらいいなと思っている日本語インタプリタの仕様を夢想する記事。|さよなら、デンスケなんてこった。このブログの右サイドに貼り付けといたデンスケブログパーツが終了していた。昨日までの公開だったらしい。いうわけで記念のキャプチャ。消えてしまったはずのものをどうやって撮ったのかというと、タブブラウザを使うとよくこんなことになる。思って開いているタブリストを確認したら昨日開いたときの元気なデンスケがまだ貼り付いてた。実をいうと「電脳コイル」は、最後まで見ていない。総復習の少し前から、見ていない。嫌いになったわけでもないのに。変数の扱いについて日本語プログラミング言語を妄想する続き。プログラミング言語Logoを日本語化しようという目論みから始まったことだけど、今の仕様ではLogoでの変数の扱いを踏襲していない。できるだけ自然な日本語の表記にしたいからだ。Logoではワードを値として参照しているときは、頭に「:」を付ける。この手続き「thing」は文字列で示された名前の変数に与えられた値を返す手続きである。これをこの言語で実現するとすれば「の値」という述語になるだろう。「:」でこの省略形を表現することで、logoではそのワードが手続きではなく、変数名として使われていることがはっきりと外見で分かるようにしてある。この用法はとても分かりやすいので、できれば倣ったほうがいいのだけど、日本語で書くときは見栄えがあまり良くない。できるだけ日本語らしく表記することを優先したいので、これを使わないことにする。述語「の値」の用意はするが。そのため、ワードは次のように処理される。処理速度なんて最初から念頭に置いていない。これは動的な言語である。■ワードの処理1.述語として登録されているか調べ、候補を選ぶ。無ければ、3.へ2.リストの並びを調べ、この候補が矛盾無く使えるか調べる。このとき、複数の述語が適合する場合は、「曖昧な表現です」という例外が発生し、解釈を中止する。一つならば、この述語の結果を持って、5.へ。3.述語として登録されていないとき、もしくは述語が定義されていてもどれも矛盾してしまうときは、変数としてその名前が登録されているか調べ、登録されていればその値を結果とし、5.へ。4.変数としても登録されていないときは、「このワードを知りません」という例外を発生させて、解釈を中止する。5.結果をこのワードの値とする。■文としてのリストの処理リストの中のワードは、どのように解釈されるだろうか。答えは、リストはリストのままである。述語に処理されることによってはじめて要素は解釈の対象となる。制御文など、リストを文として解釈する述語が実行されるときになって、そのリストの内容が文として処理される。実際にはその時点でいわゆるeval関数が実行される。そのとき変数となるべきワードは変数として解釈される。これは手本にしているLogoをそのまま踏襲している。ここまで考えておけば、後は作っていくうちになんとかなるだろう。Logo、特にUCBLogoの言語仕様を参考にして、それを日本語の文章を解釈できるようにかなり変形させている。実のところ、考え自体は数年前に漠然とできあがっていたのだけれど、日本語の解析ができずに困っていた。日本語で計算するプログラム先日の「MeCabで日本語インタプリタ」以来文章の中で考えているだけで、プログラムそのものを改良していなかったので、日本語計算インタプリタをちょっと拡張してみた。前回より少しまともになった。前回は決められた述語に、数値を入れるだけのことしかできなかったけれど、その数値の所に再帰的に文を使えるようにした。一行に続けて他の文も書けるし、漢数字も解釈できるようにした。実用的なプログラムではないので、これが人の役に立つというわけでもない。前回公開したものよりも、こちらのほうが作りたいものを表現できているので、今回も公開することにする。いままで書いてきた仕様はまだ満たしていないし、ずれている。全体像が見えてくるのはまだまだ先のことになるだろう。主な操作法を書いておくと;実行するとDOS窓が立ち上がる。漢字入力が中心なので、ALT+半角/全角キーで切り替える。「たす」「ひく」「わる」「かける」「割った余り」「くっつける」といった言葉を助詞をつけて書いて、エンターを押すと、その答えを表示してくれる。今回から、述語を組み合わせて使えるようになったので、「1と2を足した値に3を足す」とか目的語の部分に既定の述語を使った名詞節をおくことができるようになった。日本語らしく接続するために「〜した値」「〜した答え」「〜した結果」という表現なども使えるようにした。文末の表現としても「〜ます」「〜して、」といった表現もできる。「命令形」もたいてい受け入れてくれる。いうのはmecabによる解析のおかげだが、単純なことしかやっていないのでもっと工夫すれば正確な表現もできるようになるだろう。思い通りの語形変化を選んでくれないので、mecabの辞書も独自のものを作った方が処理が楽になるだろう。前の文の結果を参照する言葉として、「その結果」「その答え」などの述語が使える。結果を受けるこの言葉は、同じ行で使ってもいいし、エンターした後、次の行で使ってもいい。計算は整数演算だけしか対応していない。唯一「くっつける」は文字列演算のサンプルだ。制御構造を文の形で定義できるので、案外単純な仕組みで作れるだろう。一般的なプログラミング言語よりは楽だろう。いうところはLispの親戚らしい特徴だと思う。お気楽にPythonで作っているのも楽な理由だろうけど。クラスをもっと徹底的に使って作るべきなのだろうが、今は構造体的なものとしてしか使っていない。どんなデータ構造が必要なのかを実際プログラムを作りながら探している段階なので、全体像が分かってからクラスの中にクラスのメンバになるべき関数を移動させていくつもりだ。それにいくつかのファイルに分割していかないとどんどん分かりにくくなってる。一つのファイルだけで処理系を描ききることができれば、それはそれで面白いかもしれないが。千を十で割った値を三で割ります。その答えに三をかけて、一をその結果に足します。結果が出力されて、次のようになる。