人にとって意味が分かる、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
...初期値"わ"が入っている変数(わわわ) -
param0
param1
param2
param3
param4
param5
...その他使用できる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文字以下を削除した文字列にマッチしますが、ぽわみスクリプトではこれ以外に?
自身にもマッチします。