自分のブログログアウトチベットとコンピュータな日々チベット学関係論文のネタ、プログラムの作成日誌、大学での活動日誌を備忘録としてつけていきます。[wython]前回、日本語スクリプト言語wythonで、まだ完成していない点についてリポートしたが、そのうちコマンドライン引数の処理を実装した。onlyこれが、wython.pyを-hあるいは--helpで起動したときに表示されるヘルプ内容である。実際にターミナルではオプションの説明部分は桁がそろっている。このヘルプメッセージを表示して終了する。これがデフォルトである。同様に文字コードをJISコードにするが、ほとんど使い道はないだろう。変換後のPythonのスクリプトに、wythonのスクリプトをコメントととして埋め込む。この場合は、変換したPythonスクリプトを書き出すだけで、実行しない。変換したPythonスクリプトを書き出すだけで、実行はしない。これを見ると、-v、--source、-o、--outputを指定しない場合には、変換したPythonスクリプトを書き出した上で、その後に続く引数をその返還後のスクリプトに引数として渡して、直接スクリプトを実行する。これはまだMacOSXすなわちUnix上でやっているだけで、Windowsではやっていないので、Windows環境ではもう少し工夫しないといけないかもしれない。wythonのスクリプトを解析していって、どれにも引っかからずに通過した行については、もし、英数字および記号(つまり1バイト文字)しか含まれない場合には、それをPythonのコードとして、そのままコピーする。そこに一文字でも日本語が含まれている場合には、その行はコメントアウトされる。これは大抵エラーになるが、それはPythonスクリプトに変換されたものを実行した時点でエラーであることが分かる。これで大抵のエラーは十分であるように思われる。以上の処理は、まだ、一つのスクリプトでしか試していないので、他のスクリプトでもうまくいくかどうかを試していこうと思う。[wython]一時、かなりのところまで作ったwythonだが、しばらく中断してしまった。今月中は忙しいので、実際にはまだ取りかかれないが、これから何をしたらいいかを考えておこう。今年の四年生の卒論には、wythonと関連するテーマがいくつかある。初歩の人のためのプログラミング言語としては、どのような機能が必要かを考えている学生がいる。これはwythonの仕様を考えるための客観的な基準になる。次に、擬似コードを利用したPythonの入門教材を作っている学生がいる。擬似コードとは言うが、実際にはwythonを使う。これは動くwythonである必要はない。wython風の言語を拡張して擬似コードとして使いながら、サンプルコードを解説し、それをPythonに書き直す形で教材を作る。それから、日本語プログラミング言語として、コンパイラを作成しようとしている学生がいる。同様にPythonに直すわけだが、作り方が僕のものとは異なる。しながら、Pythonに変換していく。言語仕様は必ずしもwythonそのままであるわけでなく、wythonを参考にしながら、lexやyaccで処理できるような日本語プログラミング言語を目指す。その場合、他の日本語プログラミング言語の日本語仕様も比較対象にする。これらの研究成果をまって、最終的に仕上げることになる。仕様に関しては、以上の研究は、wythonの試金石になるだろう。それから、夏休み期間中は、プログラミング演習の課題を毎週出すことにしている。Web上に解説と問題をアップし、それを解いたプログラムを送ってもらう。毎年やっているが、今年は、授業の方でのプログラミング言語として、Javaを使ったので、Pythonを勉強できなかった。そこで、この夏休みの間に前期のJavaと同程度のPythonを勉強してもらおうと思う。その際に、解説を出来る限りwythonで擬似コードを示しながら、そして僕自身は、それをwythonで解きながら書いていこうと思う。ここでwythonが初歩のPythonの導入として実用的に使えるかどうかを検証したい。wython自身について、まだ作っていないのは、一つはエラー処理。今は全くエラーを考えていない。次に、日本語の部分をもう少し柔軟にできるようにしたい。できるだけ覚えることを少なくできるように日本語の規則を考えていきたい。変換したPythonのコードに、wythonのコードをコメントにして挿入できるようにもしたい。実行できるようにする、つまりPythonコードを書き出し、それを実行できるか、あるいはPythonコードを直接実行するようにしたい。wythonの一部にPythonのコードを書いても問題がないようにもしたい。今はおおよそは可能であるが、系統的に考えて作っているわけではないので、どれだけPythonのコードを書いても問題がないように考えみたい。ドキュメントも必要だ。言語仕様についての分かりやすいマニュアルと、入門用のチュートリアルが必要だ。これは先ほどの夏休みの課題を作るときに一緒に考えることにする。やることがたくさんある。今年一年をかけることになりそうだ。[wython]前回、まだwythonに不足している機能をいくつかピックアップしたが、今日は、その大部分を実装した。コマンドラインの引数の1番目を文字列型変数file_nameに代入する。ファイル名file_nameを読み込み用にオープンし、input_fileに代入する。コマンドライン引数の2番目をfile_nameに代入する。ファイル名file_nameを書き込み用にオープンし、output_fileに代入する。lineの中で「検索」を検索し、その結果をpos1に代入する。lineの中で「置換」を検索し、その結果をpos2に代入する。lineを改行せずに表示する。lineの中の「、」を「,」に置換して、その結果をlineに代入する。」を「.」に置換して、その結果をlineに代入する。ファイルoutput_fileにlineを書き込む。ファイルinput_fileをクローズする。ファイルoutput_fileをクローズする。line.replace("。output_file.write(line)input_file.close()output_file.close()となる。lineの中で「検索」を検索し、その結果をpos1に代入する。lineの中で「置換」を検索し、その結果をpos2に代入する。lineの中の「、」を「,」に置換して、その結果をlineに代入する。」を「.」に置換して、その結果をlineに代入する。なり、コマンドラインの第二引数に指定したファイルに、「、」を「,」、「。」を「.」に置換したテキストが書き出される。言語仕様は前回のままだが、念のため、ここで今日実装できた分をまとめておこう。コマンドラインの引数はsys.argvに置換される。そのリストの何番目の引数かは、既に実装してあるリストの項目を指定する機能が使われる。「〜を読み込み用にオープンし、〜に代入する。」および、「〜を書き込み用にオープンし、〜に代入する。」で、ファイル名からファイルをオープンし、そのファイルオブジェクトを変数に代入する。「ファイル〜をクローズする。」で、ファイルオブジェクトを閉じる。for文を使ったファイルからの読み込みは、通常のfor文の処理で十分である。「〜の中で〜を〜に置換して、その結果を〜に代入する。」で、最初の文字列の中で置換する。「〜の中で〜を検索し、その結果を〜に代入する。」では、同様に最初の文字列の中で検索し、見つかったときの位置を変数に代入する。「ファイル〜に〜を書き込む。」で、ファイルに文字列を書き出す。多少実装していない機能はあるが、これで随分といろいろいなことができるようになった。[wython]前回考えたように、ローカル変数の管理をしないとすると、あと、wythonで足りない機能は何であろうか。そもそも複雑な式expressionがうまく機能するか、というような原理的な問題は措いておくとすると、後は、組み込みの関数を、初心者の学習に必要な範囲で日本語化することだろう。それでは、どれくらい用意すればいいだろうか。基本的には基本データ型についての組み込み関数を考えると、数値に関しては、余り追加することは考えられない。〜の中の〜を〜に置換し、結果を文字列変数lineに戻す。」strip関数「文字列〜の末尾の空白を取り除き、結果を文字列lineに戻す。次に、文字列にも関係するが、ファイル関連の機能だ。ファイルを読み込みようにオープンする。ファイルを書き出しようにオープンする。ファイルから一行ずつ読み込む。ファイルに書き出しする。あと、コマンドラインの引数処理も大事だ。「コマンドラインの引数のうちx番目のもの」といった言い方で表現する。以上のものを次に実装することにしよう。[wython]日本語スクリプト言語wythonの実装の仕方で、少し方針を変更する。前回は、関数定義を導入したが、その関数内で宣言するローカル変数を、グローバルな変数と別に管理すべきではないか(これは至極まっとうな見解だ。)と考えて、その(楽な)実装の仕方を考えていた。ところが、よく考えてみたら、変数自身を何のために管理しているのかというと、文字列内で変数として使う場合に、それを%付きの書式指定にしてフォーマット文字列に変換するためだった。その変数の型だけが必要なだけだったのである。変数のテーブルでグローバルなものとローカルなものを区別しておかないと、**同じ名前**の変数が別の型で使われた場合、先に宣言した型を後で宣言したものが書き換えてしまうことになる。これではローカルで変数を宣言する意味がない。Pythonはその辺りの変数のスコープ管理はしっかりしている。そもそも、同じ変数名を別の型の変数として(、可能だからと言って、)宣言し直すだろうか。そもそもそれでは変数の名前の付け方に問題があるとしか思えない。分かりやすい名前を考えているならば、その名前に適した型があるはずである。するならば、同じ変数名をローカルで宣言しても、あるいは先にローカルで宣言し、あとてグローバルで宣言し直したとしても、型は同じになる可能性が高い。一行のテキストを保持しておくlineという変数をよく使う。これは、文字列型変数lineとして宣言するが、ローカル変数の中で、あるいはさらに言えば、関数の仮引数の中でもlineという変数を使うことが多い。グローバルに使うのであれば、プログラムの最初で宣言しておくようにすれば、そのあとで、関数の仮引数で宣言なしに使っても、変数テーブルでは「文字列型」であるという情報を保持したままであり、そしてそれは何の問題もない。wythonが言語の構造を全く考慮することなく変換していることを思い起こそう。これは同じ名前をローカルにもグローバルにも使っている場合であって、もし、関数の仮引数にしか使われない変数名だったら、どこでも宣言されないので、その型情報はなしのままであり、文字列の中で直接その仮引数名のまま使ったら、うまくフォーマット文字列に変換できないことになる。ここでも、一般的な傾向として、関数の仮引数のまま、それを文字列の中に埋め込んで出力する可能性は、極めて少ない。何らかの加工をしてから表示する。加工するときに、別の文字列型変数に代入してから、その新しい変数を文字列の中で使用すればよい。加工したものをもう一度、元の仮引数に代入し直すとしても、そこで型情報を宣言すれば、問題はなくなる。考えてくると、厳密に考えた場合、うまくいかない可能性は数パーセントはあるかもしれないが、大抵は何もしなくても、うまく行きそうなので、ローカルスコープの処理は、何もしないことにする。[wython]これは日本語「スクリプト」言語wythonとは、関係はあるが、別のプロジェクトなので、混同しないように。違うのか、と言うと、まず、wythonは、完全なPythonの日本語ラッパー言語で、Pythonコードへのトランスレータとして実装している。言語仕様を少しずつ決めながら、基本的な実装を進めているが、正規表現を駆使した(といっても、アクロバティックに駆使しているのではなく、単純な置換や検索を「たくさん」使っている、という意味。)テキスト処理にすぎない。プログラム言語の構造などは、全くお構いなしで、それはPythonにお任せ。wythonは単に入力された一行一行のみを、日本語を解釈し、それを取り去り、Pythonのコードに置き換える、というやり方で作っている。これはこれで、そんなに根を詰めなくても少しずつプログラムしていくことができるし、僕自身が使う教育用言語としてなら、十分使えるものができるだろうと思う。wythonの素晴らしいところは、実装ができてなくても、言語仕様だけだっていいということにある。それはPythonのプログラムを書くときの、日本語擬似コードとして、それなりに形式化された言語だということができるからだ。実行できなくても、wythonで書くことで、プログラムを日本語で考えることができ、しかも、それは無理な日本語ではなく、Pythonを下敷きにした言語なので、書きやすく、またPythonのコードに書き直すのも、何も機械に頼らなくたって、とても簡単にできる。それに対して日本語「プログラムミング」言語の実装というのは、言語仕様はwython流でいいが、それをちゃんとコンパイラで何らかのコードに変換するものを考えている。ちゃくとコンパイラで、ということは、字句解析をし、構文解析をし、そこから何からのコード生成をする、という手順をちゃんと踏まえるということである。いうものを考えているのかというと、wythonはPythonがインストールされていることが前提となっているが、できれば、コンパイラーないしはインタープリターとして、単独で実行できるようにしたいからだ。それから、構文解析をするために文法をきちんと構造的に定義することができれば、wythonのように、いくつかのサンプルを想定して、それを正規表現で検索置換する、などという原始的なことをしないでも、論理的・構造的に動かすことができるだろうか。いう風に作ったらいいか、これを長いこといろいろいと考えたり、調べたり、サンプルを探したりしてきたが、単独で動くようにするのは、結構大変であることが分かってきた。そもそも、目指すのがPythonのサブセットとはいえ、教育用として十分な機能を持っていてほしい、と思う。どのくらいならいいかと言うと、せいぜい、オブジェクト指向、例外処理、モジュール機構などを取り去ったくらいの言語だ。ライブラリなどは付けられないので、必要があれば直接Pythonのモジュールを呼び出せるようにはしておきたい。いうことは、言語の文法としては、かなりのものをカバーしていることになる。これを実装するとなると、大抵のコンパイラの学習用サンプルでは間に合わない。ある多機能電卓やPL/0(およびその拡張言語)程度では、全然機能が足りないので、参考にならない。そんなことで探していたら、「プログラミング言語を作る」というページが見つかった。これは、crowberというスクリプト言語を作ってみようという前橋和弥という人のページだった。この人は、結構いろいろな本を書いている人で、別にプログラミング言語作りを趣味にしているわけでもなさそうなので、どちらかというと、こういうのを作るのも楽しいでしょう、というのりの教育的ページ(うまくできたら、本にもしたい。この言語の仕様という規模がちょうど、今考えているものと同じ程度のものだ。これは、lexとyaccを使っているが、相当に行数の嵩むソースである。ガベージ・コレクタもあるし、変数には型はないし、で、本格的である。これを、言語の仕様を変えて書き直せば何とかなりそうなのだが、行数の多さに、よほど本腰を入れないとできそうにない。無道編』に載っている。これは、内部的にはRubyに処理を任せてしまう、という方針のインタープリタを徐々に作っていくという内容の本だ。Rubyに似た言語をRaccで構文解析のパーサを使って、Rubyのコードに書き直す、という、どこかで聞いたような言語を作るという話である。これをRubyのコードではなく、Pythonのコードに書き直せばいいではないか、ということになる。言語仕様を少し返るけど、規模とかレベルは同じようなものを作るのである。最初は、Rubyで作ってみて、うまく行けば、Pythonに移植する。Pythonにもyaccやlexに相当するPLYというツールがあるので、Racc用のコードをPLYに移植すればいい。してバックエンド部分をこれに任せられれば、あとは、「日本語」プログラミング言語の「日本語」の部分の処理に集中すればいい。これを考慮して言語仕様を考えていけばいいのである。wythonでは、何の構造も考えずに処理していたものを、文法構造として日本語の部分をどのように処理できるか、に考察の中心を移せるのである。いうわけで、二つの選択肢があることはあるが、手間と時間を考えた場合、やはり後者の方が費用対効果がずっといいだろう。これが最終的な選択肢になると思う。いっても、実際には僕が実装するわけではないので、一つの提案と受け取って頂きたい。[wython]関数を定義できるようにすると、その関数内でローカルな変数を使えるようにする必要があるし、引数もそのローカルな変数になる。それをインプリメントしないと本当は使えないんだが、とりあえず、関数を定義し、それを呼び出すことができるようにした。華氏温度から摂氏温度を計算する関数f2c(f)を定義する。9.0を計算して、その結果を返す。指定された数n回だけ*を表示する関数star(n)を定義する。「*」を改行せずに表示する。