Module Pretty

Pretty printer. 仮想マシンが dump するアトムリストを文字列に整形する.以下のように細かいステップからなる.

  1. まずファンクタで並べ直す(アルファベット順は気にせず,アルファベットか?記号か?と引数の数で比較する).
  2. Topological sort を行い,できるだけ木の親が子よりもリストの先頭側にくるようにする.
  3. リストを木構造のリスト(=森)へ変換する.
  4. 木構造を文字列に整形する(パーザに付随している Pretty printer をそのまま用いた).
  5. 文字列でまたソートする.
  6. 最後にリストをドットで繋げる.
type atom_name_type =
| ANAlphabet

アルファベットのアトム名. e.g. a, hoge, ...

| ANSymbol

記号ライクなアトム名. e.g. '+', '.', ' ', ...

| ANData

データライクなアトム名. e.g. 1, 2, "hoge", ...

| ANUnexpected

予想外のアトム名. e.g. 日本語, escape sequence, 空文字列, ...

アトム名でソートするために補助的に用いるアトム名の分類のための型. OCaml の Pervasives の compare はユーザ定義の ADT でも勝手に帰納的に比較してくれるので, これを活用してこの型に変換してから compare と一緒にソート関数に投げれば, 自前で比較関数を書かなくて良くなって,若干見通しが良くなる. この辺りの実装は実行時処理系の一部としてではなく,モジュール化して他のプログラムからも使えるようにしたい.

val atom_name_type_of : string -> atom_name_type

文字列のアトム名を atom_name_type に変換する

  • まだ,String 型に関しては実装していない.
val compare_functor : ('a * (string * 'b list)) -> ('c * (string * 'd list)) -> int

ファンクタを比較する. まずはアトム名のタイプで比較して,同じなら引数の個数で比較する.

val functor_sort : ('a * (string * 'b list)) list -> ('a * (string * 'b list)) list

ファンクタでソートする

val visit : (int * ('a * Eval.vm_dump_link list)) list -> ((int * ('a * Eval.vm_dump_link list)) list * int list) -> (int * ('a * Eval.vm_dump_link list)) -> (int * ('a * Eval.vm_dump_link list)) list * int list

A helper function for tpl_sort

  • あまり美しくないのでリファクタが必要
val tpl_sort : (int * ('a * Eval.vm_dump_link list)) list -> (int * ('a * Eval.vm_dump_link list)) list

Topological sort

アトムリストを木構造へ変換する

  • あまり美しくないのでリファクタが必要
val tree_of_atom : (int * ((int * int) * Parse.arg) list * (int * (string * Eval.vm_dump_link list)) list) -> (int * (string * Eval.vm_dump_link list)) -> (int * ((int * int) * Parse.arg) list * (int * (string * Eval.vm_dump_link list)) list) * Parse.arg
val forest_of_atoms : (int * (string * Eval.vm_dump_link list)) list -> Parse.arg list

アトムリストを森へ変換する

  • リストの中で,木の親が子よりも先に現れると仮定している(このために事前に topological sort を要求する)
  • あまり美しくないのでリファクタが必要
val pretty_print : (int * (string * Eval.vm_dump_link list)) list -> string