前のエントリでマジメに勉強しようと誓ったばかりだけど、とりあえず作ってみようと思ったものは作っておかないと気が済まなかったので。
「Acme::Decimalize」というAcme::Bleach系のモジュールを作ってみました。
http://github.com/sugyan/Acme-Decimalize
中身
あらゆるPerlスクリプトは10種類の記号と改行だけで表現できるか? - すぎゃーんメモで考えた記号化を数字に置き換えてみただけです。
使い方
このモジュールをuseすると、スクリプトを0~9の数字の羅列に置き換えることができます(途中、改行を挟む)。
例えば、以下のようなスクリプト'hoge.pl'
print'hoge '
に対し、以下のコマンド
perl -MAcme::Decimalize hoge.pl
を実行すると、
use Acme::Decimalize; 1837124717591871892 24004 3545 97281615402733229047458089161 85592 4509 97329621610379408 7 25 863 41613 4089758877380 9710813010
と、ファイルを書き換えます。
この数字だらけのプログラムは、Acme::Decimalizeをuseしていれば元のファイルと等価な動作をするようになっています。
$ perl hoge.pl hoge
useしていればいいので先頭行の文を取り除いた数字だけのテキストファイル'hoge.txt'
1837124717591871892 24004 3545 97281615402733229047458089161 85592 4509 97329621610379408 7 25 863 41613 4089758877380 9710813010
に対して、コマンドラインでAcme::Decimalizeをuseしてやれば実行できます。
$ perl -MAcme::Decimalize hoge.txt hoge
つまりテンキーだけでプログラムが書けるってことですね!
止ん事無き事情によりテンキーしか使えない状態になってしまっても、とりあえず
344 8950347131693813 97482 2 29303274 478449083038812141682173036 69755771543035526992 687132871364209111518 9991 068 9 75 30301182299699488764709282804430392814 8870520 50169 10706013031746 56406276248841296198673038 09880 4871142995848145472328132781497303017210430375658 1303504094930312 778832835232
というように数字キーとEnterキーだけで書いておけば、あとで
$ perl -MAcme::Decimalize fuga.txt はろー、わーるど!
と、実行できるわけです。
その他の特徴
実はプログラムを数値に置き換えるということは'Acme::Bleach::Numerically'というモジュールで実現されています。
404 Blog Not Found:数値型言語誕生!
これはプログラムのすべての文字のコードをつなげて0から1の間の数値に変換するというもの。
しかしPerlには「TIMTOWTDI」という考え方があります。
必ずしもやり方は一つじゃなくても良いはず!ということで、Acme::Decimalizeでは毎回ランダムに違う数字列が出てくるようになっています。
例えば'ほげ'と出力するだけのプログラムでも、
use Acme::Decimalize; 176031398186714812 978749427101656349 2 48101472233539 101598 922 385101 43675866721249816 642510173 8 61010907881014270341018896921248107491013 07101 834101427810175 312415212
とか
use Acme::Decimalize; 5974571454625045 867901 2953562420896108535097 12 778 535811847486 25359067218 0445801456 664853534241653541338953527 0 0535081274580457 025352830535322453509 7535 47158059858
とか
use Acme::Decimalize; 4193489646504264208529192 3474 6 816 2147432510321560474191060 88064745398983591 4129647 7624745695 54746800114740956864742172934126480284740 02474 37947421 6474768041243141
というように、毎回ちがう結果が得られます。が、実行結果はすべて同じです。
おまけ
オプションで'print'を指定するとプログラムの書き換えは行わずに変換後のプログラムを標準出力にprintします。いきなり書き換えて試さずに、これをリダイレクトして別ファイルを作成すると安全かもしれません。
$ perl -MAcme::Decimalize=print hoge.pl use Acme::Decimalize; 579586050135205436804288291604 05752641880 3000112073575 984339464381 283365751 132946204636 7982575920 66 11 929342854259454
あと、改行したくない派のヒトは'space'オプションをつけると改行の代わりに半角スペースを使った表現に変更します。
$ perl -MAcme::Decimalize=print,space hoge.pl use Acme::Decimalize; 4142064637456435270288 5861 5870494508877 026130657 224948 0 505 07623032757494 76328635 7 63891 54941132611238 0751 69648541848
これもちゃんと解釈して元のコードと等価な動作をします。
課題
- テストとかドキュメントとか全然書いてないです
- デカいファイルとかを変換すると上手く実行されないことがあります。要調査