title: プログラムのデバッグ支援(仮) author: Yasutaka Higa cover: lang: Japanese # 研究目的(仮) * プログラミングにおいて、ソースコードを改変するとプログラムの挙動も変わる * 挙動は予想されていた挙動と異なる場合があり、それはバグとなる * ソースコードの改変前と改変後の挙動を比較することで、デバッグの支援になるのでは無いか * 異なるバージョンのプログラムを同時に実行できるデバッグ支援ツールを開発する # 近況報告 * オープンキャンパスは土曜日です * ハッカーズチャンプルー行ってきました * glibc の printf ちょっと見たりしました * parallel debugger の 例探しは難航中 * Reflection without remorse を一通り流し読み # parallel debugger sample session * Cerium を clone してみました * debugger なので実行できるコードを考える * あるならそれで bisect できる * VCS にさせるべきなのかな、と思ってしまったり * もっと内部的な処理が分かる実行コード? * それってもうテストなのでは * うーん、ってなってます # reflection without remorse * 所感まとめ * モノイドに対する演算で右結合だと遅いやつ * それを右結合で書かれても CPS にすることで左結合にしよう * データ型の変換で CPS に変えることができそう * 適応例 * list の ++ とか * Monad にも適用可能っぽいです # reflection without remorse - diff list * hg/Members/atton/haskell/reflection_without_remorse にあります * DiffList を定義 * リストを取ってリストを返す ``` type DiffList a = [a] -> [a] ``` # reflection without remorse - abs and rep * List から DiffList にする rep と DiffList から List にする abs ``` absFromDiffList :: DiffList a -> [a] absFromDiffList a = a [] rep :: [a] -> DiffList a rep = (++) ``` # reflection without remorse - concat diffliset * difflist の concat は 関数合成 * difflist 最後に abs されるまで ++ は評価されないので速い * 実行例はリポジトリで ``` (+++) :: DiffList a -> DiffList a -> DiffList a (+++) = (.) ```