カトレヤ

第1回の部屋がパール、第2回の部屋がルビーだったPython温泉ですが、第3回の部屋はカトレヤでした。

なんか無茶ぶりきたこれ。というわけで作りました。

http://bitbucket.org/nishio/cattleya/

「cattleya is very very dirty superset of Python programming language.」Python2.6で実装されていて、大部分の機能はPython2.6に丸投げするので「ほぼPython2.6互換」です。新しくできるようになったこととしてはRubyみたいに文字列リテラルとかにメソッドを追加できるようになったことかな!joinメソッドが文字列のメソッドではなくリストのメソッドであることにぶーぶー文句だけたれて手を動かさない人も世の中にはいるようですけど、60行程度でリストのリテラルにjoinメソッドを足せました。

# cattleya/test_targets/join.py 
assert ["foo", "bar", "baz"].join("-") == "foo-bar-baz"
assert [1, 2, 1 + 2].join("-") == "1-2-3"

あと、re.findall(pattern, data)をdata.findall(pattern)って書けるようにしてみました。assert "aaabbaababbbaaaab".findall("a+") == ['aaa', 'aa', 'a', 'aaaa']

lenやsortedをメソッドにするとか、Noneを返す関数を書き換えてメソッドをチェーンしやすくするとか、dirtyと言い切ってしまうとやり放題だなー。ワンライナー書きやすい言語にしてみよう。

設計について

ソースファイルを読み込み、文字列として編集するプリプロセッサが走り、それから抽象構文木に変換して編集し、バイトコードコンパイルしてからまた編集して、最後にPythonのexecに渡す、という流れになっています。まあ、プリプロセスとバイトコード編集は必要になるまで作らない方針で、今は何もしないコードになっています。

で、Pythonを自分好みに書き換える上で一番障害になっているのは組み込みの文字列型や整数型なんかがread-onlyなクラスであることなのです。まあ、それがコードの読みやすさや高速化の容易さに結びついているんだからメインストリームがそういう設計なのは悪くないんですけど、パフォーマンスや読みやすさを考慮しないワンライナーとか書くのには不便。汚いコードを書けないようにする設計は汚いコードを書くのに不便。ってわけでとりあえずリテラルは全部ラッパークラスで書き換えられるようにしてしまいましょう。ちゃんとそれ用にUserListとかUserStringとかライブラリありますし。

という感じ。まあ、あんまりガチで新しい言語を作ろうという気はないので開発コード「カトレア」でPythonに変な機能を付け足しまくるような流れかなぁ。