SSブログ

wythonのコマンドライン引数 [wython]

前回、日本語スクリプト言語wythonで、まだ完成していない点についてリポートしたが、そのうちコマンドライン引数の処理を実装した。今回はその説明。

usage: wython.py [options] input_wython_file_name [arguments for wython]

options:
  -h, --help          show this help message and exit
  -s, --shift_jis   encoding of source file is shift_jis (default)
  -e, --euc-jp       encoding of source file is euc_jp
  -j, --jis              encoding of source file is iso2022-jp (=jis)
  -v, --source     output python script with wython code
  -o, --output     output python script only

これが、wython.pyを-hあるいは--helpで起動したときに表示されるヘルプ内容である。実際にターミナルではオプションの説明部分は桁がそろっている。僕の下手な英語では何だから、日本語に直しておくと、

使い方: wython.py [オプション] wythonスクリプトファイル [wythonスクリプトファイルへの引数]

オプション:
 -h あるいは --help  このヘルプメッセージを表示して終了する。
 -s あるいは --shift_jis  wythonのスクリプト、書き出されるPythonのスクリプトの文字コードをShift JISにする。
         これがデフォルトである。
 -e あるいは --euc_jp  同様に、文字コードをEUC JPにする。
 -j あるいは --jis  同様に文字コードをJISコードにするが、ほとんど使い道はないだろう。
 -v あるいは --source  変換後のPythonのスクリプトに、wythonのスクリプトをコメントととして埋め込む。
       この場合は、変換したPythonスクリプトを書き出すだけで、実行しない。
 -o あるいは --output  変換したPythonスクリプトを書き出すだけで、実行はしない。

これを見ると、-v、--source、-o、--outputを指定しない場合には、変換したPythonスクリプトを書き出した上で、その後に続く引数をその返還後のスクリプトに引数として渡して、直接スクリプトを実行する。ただし、これはまだMacOSXすなわちUnix上でやっているだけで、Windowsではやっていないので、Windows環境ではもう少し工夫しないといけないかもしれない。

 さらに、wythonのスクリプトを解析していって、どれにも引っかからずに通過した行については、もし、英数字および記号(つまり1バイト文字)しか含まれない場合には、それをPythonのコードとして、そのままコピーする。そこに一文字でも日本語が含まれている場合には、その行はコメントアウトされる。これは大抵エラーになるが、それはPythonスクリプトに変換されたものを実行した時点でエラーであることが分かる。これで大抵のエラーは十分であるように思われる。

 以上の処理は、まだ、一つのスクリプトでしか試していないので、他のスクリプトでもうまくいくかどうかを試していこうと思う。


日本語スクリプト言語wythonは今、 [wython]

一時、かなりのところまで作ったwythonだが、しばらく中断してしまった。今月中は忙しいので、実際にはまだ取りかかれないが、これから何をしたらいいかを考えておこう。

 今年の四年生の卒論には、wythonと関連するテーマがいくつかある。まず、初歩の人のためのプログラミング言語としては、どのような機能が必要かを考えている学生がいる。これはwythonの仕様を考えるための客観的な基準になる。

 次に、擬似コードを利用したPythonの入門教材を作っている学生がいる。擬似コードとは言うが、実際にはwythonを使う。ただし、これは動くwythonである必要はない。wython風の言語を拡張して擬似コードとして使いながら、サンプルコードを解説し、それをPythonに書き直す形で教材を作る。

 それから、日本語プログラミング言語として、コンパイラを作成しようとしている学生がいる。コンパイラといっても、機械語に直すわけではなく、wython と同様にPythonに直すわけだが、作り方が僕のものとは異なる。コンパイラの作成技法に忠実に、yaccとlex(にあたるツール)を使って、字句解析、構文解析をしながら、Pythonに変換していく。言語仕様は必ずしもwythonそのままであるわけでなく、wythonを参考にしながら、lexやyaccで処理できるような日本語プログラミング言語を目指す。その場合、他の日本語プログラミング言語の日本語仕様も比較対象にする。

 これらの研究成果をまって、最終的に仕上げることになる。特に仕様に関しては、以上の研究は、wythonの試金石になるだろう。

 それから、夏休み期間中は、プログラミング演習の課題を毎週出すことにしている。Web上に解説と問題をアップし、それを解いたプログラムを送ってもらう。毎年やっているが、今年は、授業の方でのプログラミング言語として、Javaを使ったので、Pythonを勉強できなかった。そこで、この夏休みの間に前期のJavaと同程度のPythonを勉強してもらおうと思う。その際に、解説を出来る限りwythonで擬似コードを示しながら、そして僕自身は、それをwythonで解きながら書いていこうと思う。ここでwythonが初歩のPythonの導入として実用的に使えるかどうかを検証したい。

 さて、wython自身について、まだ作っていないのは、一つはエラー処理。今は全くエラーを考えていない。次に、日本語の部分をもう少し柔軟にできるようにしたい。できるだけ覚えることを少なくできるように日本語の規則を考えていきたい。

 変換したPythonのコードに、wythonのコードをコメントにして挿入できるようにもしたい。もちろん、wython を直接実行できるようにする、つまりPythonコードを書き出し、それを実行できるか、あるいはPythonコードを直接実行するようにしたい。

 wythonの一部にPythonのコードを書いても問題がないようにもしたい。今はおおよそは可能であるが、系統的に考えて作っているわけではないので、どれだけPythonのコードを書いても問題がないように考えみたい。

 もちろん、ドキュメントも必要だ。言語仕様についての分かりやすいマニュアルと、入門用のチュートリアルが必要だ。これは先ほどの夏休みの課題を作るときに一緒に考えることにする。

 随分とやることがたくさんある。今年一年をかけることになりそうだ。


wythonにいくつかの関数を実装 [wython]

 前回、まだwythonに不足している機能をいくつかピックアップしたが、今日は、その大部分を実装した。まずはサンプルを挙げよう。

コマンドラインの引数の1番目を文字列型変数file_nameに代入する。

ファイル名file_nameを読み込み用にオープンし、input_fileに代入する。
コマンドライン引数の2番目をfile_nameに代入する。
ファイル名file_nameを書き込み用にオープンし、output_fileに代入する。

ファイルinput_fileから一行ずつ文字列変数lineに読み込みながら、
  lineの中で「検索」を検索し、その結果をpos1に代入する。
  lineの中で「置換」を検索し、その結果をpos2に代入する。
  もし、pos1が0以上、あるいは、pos2が0以上ならば、
    lineを改行せずに表示する。
  lineの中の「、」を「,」に置換して、その結果をlineに代入する。
  lineの中の「。」を「.」に置換して、その結果をlineに代入する。
  ファイルoutput_fileにlineを書き込む。

ファイルinput_fileをクローズする。
ファイルoutput_fileをクローズする。

これをwythonで変換すると、

#!/usr/bin/env python
# -*- coding:euc-jp -*-

import sys
file_name = sys.argv[1]

input_file = open(file_name)
file_name = sys.argv[2]
output_file = open(file_name, "w")

for line in input_file:
    pos1 = line.find("検索" )
    pos2 = line.find("置換" )
    if pos1 >= 0 or pos2 >= 0:
        print line,
    line = line.replace("、" , "," )
    line = line.replace("。" , "." )
    output_file.write(line)

input_file.close()
output_file.close()

となる。画面に書き出される結果は、

  lineの中で「検索」を検索し、その結果をpos1に代入する。
  lineの中で「置換」を検索し、その結果をpos2に代入する。
  lineの中の「、」を「,」に置換して、その結果をlineに代入する。
  lineの中の「。」を「.」に置換して、その結果をlineに代入する。

となり、コマンドラインの第二引数に指定したファイルに、「、」を「,」、「。」を「.」に置換したテキストが書き出される。

言語仕様は前回のままだが、念のため、ここで今日実装できた分をまとめておこう。

  1. コマンドラインの引数はsys.argvに置換される。そのリストの何番目の引数かは、既に実装してあるリストの項目を指定する機能が使われる。
  2. 「〜を読み込み用にオープンし、〜に代入する。」および、「〜を書き込み用にオープンし、〜に代入する。」で、ファイル名からファイルをオープンし、そのファイルオブジェクトを変数に代入する。
  3. 「ファイル〜をクローズする。」で、ファイルオブジェクトを閉じる。
  4. for文を使ったファイルからの読み込みは、通常のfor文の処理で十分である。
  5. 「〜の中で〜を〜に置換して、その結果を〜に代入する。」で、最初の文字列の中で置換する。
  6. 「〜の中で〜を検索し、その結果を〜に代入する。」では、同様に最初の文字列の中で検索し、見つかったときの位置を変数に代入する。
  7. 「ファイル〜に〜を書き込む。」で、ファイルに文字列を書き出す。
まだ多少実装していない機能はあるが、これで随分といろいろいなことができるようになった。

wythonでは、あと何が足りないか [wython]

前回考えたように、ローカル変数の管理をしないとすると、あと、wythonで足りない機能は何であろうか。そもそも複雑な式expressionがうまく機能するか、というような原理的な問題は措いておくとすると、後は、組み込みの関数を、初心者の学習に必要な範囲で日本語化することだろう。

 それでは、どれくらい用意すればいいだろうか。基本的には基本データ型についての組み込み関数を考えると、数値に関しては、余り追加することは考えられない。

 文字列については、もう少し追加したい。

  1. 検索関数「文字列〜の中で文字列〜を検索し、その結果を変数posに代入する。」
  2. 置換関数「文字列〜の中の〜を〜に置換し、結果を文字列変数lineに戻す。」
  3. strip関数「文字列〜の末尾の空白を取り除き、結果を文字列lineに戻す。」

くらいだろうか。

 次に、文字列にも関係するが、ファイル関連の機能だ。

  1. ファイルを読み込みようにオープンする。
  2. ファイルを書き出しようにオープンする。
  3. ファイルから一行ずつ読み込む。
  4. ファイルに書き出しする。

あと、コマンドラインの引数処理も大事だ。

  1. 「コマンドラインの引数のうち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を256倍使うための本 無道編

Rubyを256倍使うための本 無道編

  • 作者: 青木 峰郎
  • 出版社/メーカー: アスキー
  • 発売日: 2001/02
  • メディア: 単行本

 もう一つ、もっと楽をして、Rubyのパーサ・ジェネレータであるRaccを使ったインタプリタの例が、そのRaccの作者青木峰郎という人の書いた『Rubyを256倍使うための本 無道編』に載っている。これは、内部的にはRubyに処理を任せてしまう、という方針のインタープリタを徐々に作っていくという内容の本だ。つまり、Rubyに似た言語をRaccで構文解析のパーサを使って、Rubyのコードに書き直す、という、どこかで聞いたような言語を作るという話である。つまり、これをRubyのコードではなく、Pythonのコードに書き直せばいいではないか、ということになる。つまり、言語仕様を少し返るけど、規模とかレベルは同じようなものを作るのである。

 最初は、Rubyで作ってみて、うまく行けば、Pythonに移植する。幸い、Pythonにもyaccやlexに相当するPLYというツールがあるので、Racc用のコードをPLYに移植すればいい。こうしてバックエンド部分をこれに任せられれば、あとは、「日本語」プログラミング言語の「日本語」の部分の処理に集中すればいい。これを考慮して言語仕様を考えていけばいいのである。wythonでは、何の構造も考えずに処理していたものを、文法構造として日本語の部分をどのように処理できるか、に考察の中心を移せるのである。

 というわけで、二つの選択肢があることはあるが、手間と時間を考えた場合、やはり後者の方が費用対効果がずっといいだろう。これが最終的な選択肢になると思う。といっても、実際には僕が実装するわけではないので、一つの提案と受け取って頂きたい。


wythonに取り敢えず関数定義を実装 [wython]

関数を定義できるようにすると、その関数内でローカルな変数を使えるようにする必要があるし、引数もそのローカルな変数になる。それをインプリメントしないと本当は使えないんだが、とりあえず、関数を定義し、それを呼び出すことができるようにした。

たとえば、

華氏温度から摂氏温度を計算する関数f2c(f)を定義する。
  (f - 32) * 5.0 / 9.0を計算して、その結果を返す。

指定された数n回だけ*を表示する関数star(n)を定義する。
  nが0より大きい間、
    「*」を改行せずに表示する。
    nから1を引く。
  改行する。

##メインのプログラム

華氏温度を表す整数型変数fに-20を代入する。
摂氏温度を表す実数型変数cに0を代入する。
「華氏 摂氏」と表示する。
fが100よりも小さい間、
  関数f2c(f)を呼び出し、その結果をcに代入する。
  「f  c」を表示する。
  fに20を足す。

整数型変数iに0を代入する。
1から10までiを変化させながら、
  「i:」を改行せずに表示する。
  関数star(i)を呼び出す。

を変換すると、

#!/usr/bin/env python
# -*- coding:euc-jp -*-

def f2c(f):
    return (f - 32) * 5.0 / 9.0

def star(n):
    while n > 0:
        print "*" ,
        n -= 1
    print

# ##メインのプログラム

f = -20
c = 0
print "華氏  摂氏" 
while f < 100:
    c = f2c(f)
    print "%d    %f" % (f, c)
    f += 20

i = 0
for i in range(1, (10 + 1)):
    print "%d:" % (i),
    star(i)

となる。実行すると、

華氏  摂氏
-20    -28.888889
0    -17.777778
20    -6.666667
40    4.444444
60    15.555556
80    26.666667
1: *
2: * *
3: * * *
4: * * * *
5: * * * * *
6: * * * * * *
7: * * * * * * *
8: * * * * * * * *
9: * * * * * * * * *
10: * * * * * * * * * *

となる。今回の仕様は

  1. 関数定義は、「関数〜を定義する。」をキーワードに行う。〜には、関数名と引数をPythonと同じように書く。
  2. 関数呼び出しは、戻り値がない場合は、「関数〜を呼び出す。」とする。〜には上と同様の関数名と引数を指定する。
  3. 関数の戻り値を使う場合には、「関数〜を呼び出して、その結果を変数〜に代入する。」と使う。ただし、これはそもそも代入文のままなので、関数とは関係なしに機能する。
  4. 関数から戻り値を返すには、「〜を返す。」とする。〜から日本語を削除したものにreturnを前置きした文に変換する。

といったところだ。上にも言ったように、ローカル変数を使えるようにするのは次回回し。


日本語スクリプト言語wythonのスタンス [wython]

最近、so-netのブログがよく落ちるので、更新がとびとびになってしまっています。すみません。

 世の中でwythonがどの程度言及されているかを調べるために、Googleで検索をしてみたら、40数件ヒットした。余り話題になっていないことがわかった。しかも、かなりのものは意識的に言及しているのではなく、検索結果を自動的に表示しているようなページだった。

 そのこと自体は、そもそも実装もなしてやっていることだったので、仕方のないことだと思うのだが、こういうブログで半年以上、ばらばらに書いてきたことが裏目に出て、言及されている場合も、古い記事の方が引っかかっている場合があった。特に細かい仕様などは、ああでもない、こうでもない、と書いてきたので、その時々に揺れがある。本当は、オフィシャルなページを作ってそこできちんと最新情報のみを管理した方がいいのだろう。ということは何日か前に書いた。しかし、現実にオフィシャルページを作るとなると、それなりに準備がいるので、すぐにアップするわけにはいかず、ふたたび、このブログで少しずつ思いついたことを書いていくことにする。これが貯まればいつかはオフィシャルページに結実することを願って。

 さて、そうやって日本語プログラミング言語をあれこれ検索していみると、その中に、日本語プログラミングの歴史と現状についてプレゼンをしている資料があった。発表時期は2005年6月4日だが、wythonは2005年1月の時点での参照であった。ここで、wythonは第2.5世代のプログラミング言語に位置付けられ、さらに「日本語プログラミングコンテストに刺激されたり、それ以降の日本語プログラミング言語ブームに刺激されて登場したと思われる。市場シェアはまだない。」とコメントされていた。

 これは、wythonのみについての言及ではなく、第2.5世代のプログラミング言語、すなわち、昨年の夏に行われた「日本語プログラミングコンテスト」以降に発表されものについての総評だが、少なくともwythonについては当てはまらない。wythonは僕のプログラミング関係演習で、どうしたら初心者にプログラミングの肝を教えられるかを考えているうちに思いついたものだった。何とか分かってもらおうと日本語でプログラムの一行一行に説明を書いていくと、かなりの学生が分かるようになっていった。それなら、最初から欧文でプログラムを勉強するのではなく、日本語でプログラミングの本質的要素について理解した上で、それを欧文のブログらミング言語に移し替えていけば、理解が進むのではないか、という発想である。

 だから、wythonは完全に初心者向けの教育用言語に特化している。他の日本語プログラミング言語は、ほとんどのものが初心者からベテランまで使え、少ないコーディングでいろいろできる便利な命令を備え、ビジュアルな開発環境もついているし、ビジュアルなプログラムも驚くほど簡単にできる、ということを標榜している。しかし、wythonにはそのいずれも備わっていない。それらの真逆である。

 開発環境は何もないので、エディタで作る。プログラムはコマンドラインで動かす。命令は、そのうち多少増やしはするが、動詞に類するものは非常に少ない。いわんやグラフィカルなプログラムは作れないし、そういう命令や関数もない。ベテランが使うものでもない。

 しかし、これらは決して欠点でも不足点でもない。最初からそんなことは考えていないのである。いやむしろ、ある意味ではwythonは極めて高機能な言語だと言ってもいい。それは自然に、スムーズにPythonに以降でき、あるいはPythonのコードと混ぜて使うことが出来る。wythonの発展した形はPythonであるとすれば、その機能は極めて豊富ということになる。

 また他の言語が全てWindowsに特化しているのに対し、wythonはPythonで実装されているので、Pythonがインストールしてあるところならどこでも使える。これは利点であって欠点には決してならない。

 さらに、「プログラム」の本質的構成要素を学ぶためのものであり、しかもPythonに移行することを前提にしているので、Pythonのプログラムと一行単位でほぼ対応がつけられる。もちろん、純粋にPythonで書くならば、Python流のコンパクトな書き方をすることができるが、そういう部分は逆にPythonの独特の部分であり、プログラミング一般の勉強には適さない。つまりやや冗長であっても、wythonで書いたプログラムは、たとえwythonの処理系がなくても、そのままPythonに容易に書き直すことができる。

 そもそも最初の助走を除いて日本語で最後までプログラミングを続けることには無理がある。できるかもしれないが、それは他のものとかなり異質な概念と用語と仕様の中に閉じこもることになり、それがいろいろな言語を使うことを妨げることになってしまう。

 wythonは、たとえ実装されていない部分があっても、それで書くことによって、Pythonプログラミングの日本語によるコメント、あるいは擬似コードとして使うこともできる。たとえば、現在wythonには正規表現は実装されていないが、それをwython風に書くことは容易である。それをPythonの書き直すのも、機械の手を借りることなく、簡単にできる。こうなってくるとwython自体は、プログラミング言語だが、処理系にそのものさえ不要な言語だと言うことになる。その意味ではPythonのベテランでも、使い道があると言える。

 こういう考え方で作られた言語は、少なくとも日本語プログラミング言語の中には存在しないように思う。その意味でwythonは画期的な言語ではないだろうか。(もうちょっとしっかりドキュメントができていればだが。)


wythonにおけるリストとfor構文 [wython]

リストないしは配列を日本語で表現するのは、難しい。全体としてのリストならば、リスト[これ、これ、これ}でいいけれども、添字でその一つ一つの項目を指定する仕方は、どうしても冗長になってしまう。とりあえず、次のようなものを考えてみた。

リスト[「東京」、「京都」、「大阪」、「名古屋」、「仙台」、「札幌」]をリスト型変数citiesに代入する。

citiesの3番目の項目を表示する。
citiesの0番目に「横浜」を代入する。
citiesに「北九州」を追加する。

整数型変数nにcitiesの個数を代入する。
0からn-1までiを変化させながら、
  「%s, 」% (citiesのi番目の項目)を改行せずに表示する。
改行する。

リストcitiesの各項目を文字列型変数cityに代入しながら、
  「city、」と改行せずに表示する。

改行する。

 これをwythonで処理すると、

#!/usr/bin/env python
# -*- coding:euc-jp -*-

cities = ["東京" , "京都" , "大阪" , "名古屋" , "仙台" , "札幌" ]
print cities[3]
cities[0] = "横浜" 
cities.append("北九州" )
n = len(cities)
for i in range(0, (n-1 + 1)):
    print "%s, " % (cities[i]),
print
for city in cities:
    print "%s、" % (city),
print

となる。その実行結果は、

名古屋
横浜,  京都,  大阪,  名古屋,  仙台,  札幌,  北九州, 
横浜、 京都、 大阪、 名古屋、 仙台、 札幌、 北九州、

である。ここでは、「番目」というキーワードを、リストの項目の指示に用いた。「〜番目の項目」でも「〜番目の文字」でも、「〜番目の要素」でも、さらには「〜番目」だけでもよい。

 その他、いくつかの動詞や、forによる繰り返し構文も追加した。ここで、今回追加した言語仕様をまとめておこう。

  1. リストのリテラル表現は、Pythonにならって、[ ]で囲む。[]は全角[]でもよく、項目を区切るコンマは、全角の「、」や「,」でもよい。
  2. リストはリスト型の変数に代入する。
  3. リストの項目は「〜番目」というキーワードで指示する。最小と代入が可能なのは、wythonの機能ではなく、Pythonの機能である。〜番目から〜番目という範囲指定はまだサポートしていない。
  4. リストに対するメソッドappendを「〜に〜を追加する。」というキーワードで実装した。
  5. リストや文字列などの長さを測るlen()関数を「〜の個数」あるいは「〜の長さ」というキーワードで実装。
  6. for item in list構文を、「リストlistの各項目を〜型変数itemに代入しながら、」(もちろん、listとitemという変数名は自由に付けられる。ただし、listのリテラルは駄目。)というキーワードで実装。
  7. %を使った書式つき文字列は、サポートしているというよりは、文字列部分の「」を除いて、全てローマ字なので、そのまま式として認識されているだけ。逆に言うと、Pythonの関数なども、そのまま書いておけば、大抵は使えると思う。

 こういう仕様や実装方法について、各回にバラバラに書いていると、その都度、変更があったりした場合に分かりづらくなるので、そろそろ最新の情報をまとめたページを作って、きちんとまとめておいた方がよさそうだ。変更があったら、そのページを更新するようにして。

 次は、関数の実装をしよう。これはローカル変数をうまく処理したり、関数名を日本語でどうするか、など解決しなければならない問題があるので、少し時間がかかりそう。


次はループをインプリメント [wython]

日本語スクリプト言語wythonの実装を続ける。今日は、繰り返しを処理できるようにした。wythonはPythonのラッパーなので、繰り返しには、while文とfor文がある。このうち、for文は特に日本語でどう表現したらいいか分からないので、後回しにして、簡単にできるwhile文と、forを使ううちでも、ある数からある数まで数える、range()を使う場合を取り上げる。

 具体的に、wythonのスクリプトを示すと、

整数型変数sumに0を代入する。
整数型変数nに0を代入する。

nが10以下の間、
	sumにnを足す。
	nに1を足す。

sumを表示する。

sumに0を代入する。

1から10までnを変化させながら、
	sumにnを足す。

sumを表示する。

整数型変数mに0を代入する。

1から10まで変化するnの各々について、
	「n : 」を改行せずに表示する。
	1からnまでmを変化させつつ、
		「*」を改行せずに表示する。
	改行する。

これをPythonに変換すると、

#!/usr/bin/env python
# -*- coding:euc-jp -*-

sum = 0
n = 0
while n <= 10:
	sum += n
	n += 1
print sum
sum = 0
for n in range(1, (10 + 1)):
	sum += n
print sum
m = 0
for n in range(1, (10 + 1)):
	print "%d : " % (n),
	for m in range(1, (n + 1)):
		print "*" ,
	print
となる。結果は、
55
55
1 :  *
2 :  * *
3 :  * * *
4 :  * * * *
5 :  * * * * *
6 :  * * * * * *
7 :  * * * * * * *
8 :  * * * * * * * *
9 :  * * * * * * * * *
10 :  * * * * * * * * * *

である。

 繰り返し以外にも若干追加をしているので、今日実装した機能の仕様をまとめておこう。

  1. while文は、「〜の間、」をキーワードにする。
  2. for文のうち、数え上げのrange()を使う文は、「〜から〜まで」を最初に記し、そのあとは変数名を一つ組み込むこととして、日本語表現は、特に制約を設けない。実際、上の例では、「nを変化させながら」「変化するnの各々について」「nを変化させつつ」というように、日本語が自然になるように言い換えている。
  3.  x += n タイプの複合代入文は、「足す」と「引く」だけについては、「xにnを足す」「xからnを引く」と表記できる。
  4. 「改行せずに表示する」という動詞句を新設。これはprint文の最後にカンマを出力し、改行しない表示に対応した。
  5. 一方「改行する。」という文も新設し、これはprintのみに変換され、改行を出力する。
  6. 「代入する。」場合にも、最初に変数宣言したあとは、型に言及せずに変数名だけを使用できるようにした。

以上の仕様は、全て上の例文で使われている。

次は、リスト処理としてのfor文と、できればリストの表現とを考えたい。


この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。