Module Pretty
Pretty printer. 仮想マシンが dump するアトムリストを文字列に整形する.以下のように細かいステップからなる.
- VM の提供する関数
dump_atom_list
を使って, アトムに id を振って,リンクはその id とポート番号の組にしたアトムリストを受け取り,
- まずファンクタで並べ直す(アルファベット順は気にせず,アルファベットか?記号か?と引数の数で比較する).
- Topological sort を行い,できるだけ木の親が子よりもリストの先頭側にくるようにする.
- リストを木構造のリスト(=森)へ変換する.
- 木構造を文字列に整形する(パーザに付随している Pretty printer をそのまま用いた).
- 文字列でまたソートする.
- 最後にリストをドットで繋げる.
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 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_link : int -> int -> (int * ((int * int) * Parse.arg) list * (int * (string * Eval.vm_dump_link list)) list) -> Eval.vm_dump_link -> (int * ((int * int) * Parse.arg) list * (int * (string * Eval.vm_dump_link list)) list) * Parse.arg
アトムリストを木構造へ変換する
- あまり美しくないのでリファクタが必要
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