Pretty Print 2

前回論文のリンクを張り忘れていたので: http://homepages.inf.ed.ac.uk/wadler/papers/prettier/prettier.pdf

今朝の電車で試しに実行してみたら、おしい、カンマを忘れるの構文エラーが1つあった!まだまだ精進が必要ですな。

で、実行してみると案の定書いておいたraise NotImplementedErrorに引っかかったのであった。元論文の型クラスDOCに相当するものをPythonの空クラスADocを作って継承させたけど、そのクラスを使った型チェックをする前にまずはraise NotImplementedErrorでxが期待したクラスになっていないわけなんだからそれを表示して観測するべきだな、と修正。直前がUnionの時に期待と違うわけだな、とその箇所を眺めたら

     if isinstance(y, Union):
         return better(w, k, 
-                      be(w, k, [(i, x)] + z),
-                      be(w, k, [(i, y)] + z))
+                      be(w, k, [(i, y.x)] + z),
+                      be(w, k, [(i, y.y)] + z))

これか。元の論文ではDOCとDocを区別していたり、xって変数のある内側のスコープで別のxって変数を使ったりしてて、さすがにそういうのはどうかなぁと思いつつ「変数の名前の付け替えをするのはリファクタリングだから動いてテストを書いてから」とぐっとこらえてるナウ。

あと2箇所同じようなミスがあって、1箇所カッコのつけ方が間違っているのがあった。修正。テストも書いたよー

>>> pretty(10, Text("a"))
'a'
>>> print pretty(10, fillwords("a b c d e"))
a b c d e
>>> print pretty(5, fillwords("a b c d e"))
a b c
d e
>>> print pretty(3, fillwords("a b c d e"))
a b
c d
e

うむうむ、少なくとも基本的な機能に関してはちゃんと動いているな。今日の帰りはテストのカバレッジを100%にして、それでまだ時間があったらリファクタリングを始めるとしよう。