以下の内容はhttps://nishiohirokazu.hatenadiary.org/entry/20100902/1283437962より取得しました。


Pretty Print 7

さて、ここしばらくいじっていたpretty printだが、そろそろちゃんと動いたことに満足して関心が薄れてきたので、今までの経験上「ここでなんとなくほったらかすとしばらくしてからどういう状態だったのかわからなくなる!」と思って一気にリポジトリの公開とPython Package Indexに入れるところまでやっつけた。

Python Package Index : prettier 0.92
nishio / prettierprint / source — bitbucket.org

ここまでのストーリーのおさらい。

  • Pythonいじり2
    • Pythonで対話的実行の時に入力したコードの構文木を表示するようにしてみたが、構文木が長くなると適当に改行してくれないとみにくい。調べてみたらRubyはとある論文に基づいてprettyprint.rbを実装している。サンプルコードがHaskellで2ページ程度、これを移植すればいいんじゃない?
  • PrettyPrint 1
    • とりあえず気合でHaskellで書かれたサンプルコードを逐語訳。
  • Pretty Print 2
    • テスト
  • Pretty Print 3
    • テストのカバレッジを100%に。あとすごく遅い現象を発見して、それは遅延評価じゃなくなったせいだった。
  • Pretty Print 4
    • 元コードのutilityに入っていたspreadって関数は与えられたドキュメントのリストを水平に並べるものだが、それを「1行になる」と期待して使ったらならなかったのではまった話。っていうか今思うと1行になるようにするのがAPIの設計としては適切じゃないかという気がする。あと空白文字を挟んでつなげるのと改行を挟んでつなげるのの2つのユーティリティ関数が実装されていたがそんな決め打ちのセパレータじゃなくてPythonの", ".join(xs)みたいに引数として渡せるべきじゃないの。
    • まあここでもともと僕が欲しかった機能はサポート完了
  • Pretty Print 6
    • チューニング。最初に逐語訳をしたときに考えていた最適化をおおよそ実装し終わる。

今後について

まずセパレータとかインデントの幅とかが決め打ちなのは変更できるべき。Haskell的に表現するなら各種の関数が設定の入ったenvを引数に取るようにするべきで、Python的には「somethingが毎回渡される関数の群れ」ってのは要するに「あるクラスのメソッドたち」なわけだ。だからPrettyPrinterってクラスを作ってその中に移動するのがよかろう。

APIは若干整理の必要がある。論文に書いてあったのでそのまま実装したけど、fillwordsとか必要ないし。コア部分に関してはHaskell前提で書かれているものの直訳だから、Python前提で0から書けばもっと見やすくなるかも知れないなーという気がする。

最終的に標準ライブラリのpprintを置き換えられる性能・機能になれればいいなぁ。




以上の内容はhttps://nishiohirokazu.hatenadiary.org/entry/20100902/1283437962より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14