Python の文法だけを Ruby っぽくしてみたらどうなるか実験した
こんにちわ、あらびきプログラマー moriyoshi です。
Python が生理的に嫌いな人からよく聞く話として「インデントでブロック構造を表す」ってのがありますね。じゃあ中身はそのままで文法だけ Ruby っぽくしたらどうなるんでしょうかね。Python はトークナイザもパーサも簡単に書き換えられるので、試してみましょう。
例えば次のようなプログラムは
class Boo(object): def foo(hoge): try: for i in hoge: with i: if i.fuga: while True: j = i.fuga() if not j: break print j + 2 except HogeException: pass else: pass finally: pass
こんな風になってしまうわけです。ああ怖いですね。
class Boo(object) def foo(hoge) try for i in hoge with i if i.fuga while True j = i.fuga() if not j break end print j + 2 end end end end except HogeException else finally end end end
追記: パッチはgistにうまく貼れなかったので直接貼ろうと思いましたがそれもうまくいかないので pastebin.com に貼ります。
Python の文法は BNF ライクな記法で書かれた Grammar/Grammar というファイルに書かれていて、まずはこれが pgen というパーサジェネレータで C の LL パーサのコードに変換されるわけですね。このパーサのコードというのは Grammar にあるノード名がそのまま構文木となるようないわば CST (concrete syntax tree) を生成するようなものになってまして、これを人力で Python/ast.c で AST に変換し、最後に Python/compile.c でバイトコードに変換する、ってまあそんな構造になっているのをちょちょいと改変 (改悪) してるわけですはい。
pbtrans.py という Python からこの言語へのトランスレータもあるので、さっそく移行したいという人もまったく心配ありません。よかったですね!
あ、動画では律儀にインデントいれてますけどほんとは必要ないです!ほんとです!