Subscribed unsubscribe Subscribe Subscribe

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 からこの言語へのトランスレータもあるので、さっそく移行したいという人もまったく心配ありません。よかったですね!

あ、動画では律儀にインデントいれてますけどほんとは必要ないです!ほんとです!