人にとって意味が分かる、Lisp風スクリプトをぽわみスクリプトに変換するPythonモジュールです。リポジトリ内のpowamiフォルダを、使用するPythonコードのあるフォルダに配置して使ってください。 サンプルコードは"powamiTranslator.py"です。
やりたいことのイメージ
※旬に遅れないようにということで、軽く動作チェックだけして公開しているため、バグがあるかもしれません。ご了承ください。
※公式もちゃんとぽわみスクリプトに変換する、別スクリプトを用意しているようです(ぽわみスクリプト トランスパイラ)。 好みな方をお使いください。
このスクリプトでは1つの命令文を1つのリストとして表現し、複数の命令文(リスト)を格納するリストをPspyオブジェクトに
渡すことで実行されます。
from powami.pspy import Pspy
pst = Pspy(u"ぽ")
code = [
["assignment", "param0", u"?"],
["addParamToRight", "output", "input"],
["addParamToRight", "output", "param0"],
["addParamToLeft", "output", "param0"],
]
psResult = pst.exec(code)
Pspyクラスのオブジェクトを初期化し、input_strのぽわみ文字列が入力として渡されます。
※ぽわみ文字列...ぽわ!?~ーのみから構成される文字列
codeのリスト内にある命令文を実行し、さらにcodeをぽわみスクリプトに変換します。
このメソッドの処理の最後で、output変数(ぽわみスクリプトではわ~ぽ)に格納されたぽわみ文字列が出力されます。
このメソッドは変換されたぽわみスクリプトを返します。
ぽわみスクリプトでは10個の変数が用意されていますが、このスクリプトでは以下のような名前にしております。
-
input...入力が入る変数(ぽ~わ) -
output...出力を入れる変数(わ~ぽ) -
paramP...初期値"ぽ"が入っている変数(ぽぽぽ) -
paramW...初期値"わ"が入っている変数(わわわ) -
param0param1param2param3param4param5...その他使用できる6つの変数
基本的に[命令語, 引数1, 引数2]というように3つの要素から構成されます。引数2は命令語によって不要な場合があります。命令語に必要な数の要素が足りていれば、オーバーしている分は無視する形で動きます。
| 命令語 | 引数1 |
引数2 | 説明 |
|---|---|---|---|
| assignment | 変数名 | 変数名 or ぽわみ文字列 | 引数1 に 引数2を代入する。 |
| addParamToRight | 変数名 | 変数名 | 引数1 を 引数1 の右側に 引数2 を繋げたものにする。 |
| addParamToLeft | 変数名 | 変数名 | 引数1 を 引数1 の左側に 引数2 を繋げたものにする。 |
| splitRightCharacter | 変数名 | 変数名 | 引数1 を 引数1 の右端 1 文字を削除したものにし、引数2 を削除した 1 文字にする。削除に失敗した時 引数2 は空文字列になる。 |
| splitLeftCharacter | 変数名 | 変数名 | 引数1 を 引数1 の左端 1 文字を削除したものにし、引数2 を削除した 1 文字にする。削除に失敗した時 引数2 は空文字列になる。 |
| deleteRightCharacter | 変数名 | 不要 | 引数1 を 引数1 の右端 1 文字を削除したものにする。 |
| deleteLeftCharacter | 変数名 | 不要 | 引数1 を 引数1 の左端 1 文字を削除したものにする。 |
| powamiFlip | 変数名 | 不要 | 引数1 を 引数1 の 反転 にする。 |
| powamiAdd | 変数名 | 変数名 | 引数1 を 引数1 と 引数2 の 積 にする。 |
| powamiOr | 変数名 | 変数名 | 引数1 を 引数1 と 引数2 の 和 にする。 |
powamiFlip, powamiAnd, powamiOrにある反転、積、和についての詳細はぽわみスクリプトをご覧ください
ぽわみスクリプトには分岐、繰り返しのための制御構文があり、このスクリプトでもサポートしております。Pspyでは以下のように入力します。
[制御キーワード, 変数, パターン, [命令文], [命令文], ... , [命令文]]
例.
code = [
["addParamToRight", "output", "input"],
["ifNot", "input", u"*",
["addParamToRight", "output", "input"],
["whileNot", "output", u"*",
["splitLeftCharacter", "output", "param1"],
["deleteRightCharacter", "output"],
]
]
]
パターンの後ろの命令文リストの羅列がブロックになります。変数の中身がパターンにマッチングするかしないかで、ブロック内の命令を実行するか、しないかを制御します。例のように、ブロック内にさらに制御文を書くこともできます。
| 制御キーワード | 説明 |
|---|---|
| if | 変数がパターンにマッチする場合のみ、ブロック内の処理を実行する。 |
| ifNot | 変数がパターンにマッチしない場合のみ、ブロック内の処理を実行する。 |
| while | 変数がパターンにマッチする場合、ブロック内の処理を実行し、実行後も変数がパターンにマッチする場合は、繰り返し、ブロック内の処理を実行する。 |
| whileNot | 変数がパターンにマッチしない場合、ブロック内の処理を実行し、実行後も変数がパターンにマッチしない場合は、繰り返し、ブロック内の処理を実行する。 |
ぽわみスクリプトでの仕様の詳細はこちらをご覧ください。
このスクリプトでもパターンは全角文字で指定しますが、元々の正規表現に少しでも近づけるために、ぽわみスクリプトから使用する 文字を変更しております。
ぽわみスクリプト→Pspy
ー→.
~→*
!→¥
ぽわみスクリプトのパターンに使用する正規表現と元々の正規表現には一部違いがあるので、注意する必要があります。
*
もともとは直前の文字の0回以上の繰り返しにマッチしますが、ぽわみスクリプトではこれ以外に~自身にもマッチします。
また、*だけの場合は、空文字列のみとマッチングします。
?
もともとは直前の0文字以上1文字以下を削除した文字列にマッチしますが、ぽわみスクリプトではこれ以外に?自身にもマッチします。