.cmiの読み込み
30分プログラム、その378。.cmiをよ読み込んで、ひらメソッドのテンプレートを生成してみたかったので、試してみた。
id:mmatsuoka:20080515を参考にしたけど、うまく欲しい情報が取れなかった。やっぱりmliをパースしたほうが楽かもしれない。
使い方
こんな座標計算をするsample.mlを用意する。
type point = { x : int; y : int} let distance {x=x1; y=y1} {x=x2; y=y2} = let x = x1 - x2 in let y = y1 - y2 in sqrt (float_of_int (x*x + y*y))
$ ocamlc sample.ml
それをダンプする。
$ ./dump sample.cmi type 'point' type 'distance' id:-4 level:100000000 label:<> id:-5 level:100000000 label:<>
ソースコード
open Printf let input_name_sign ch : string * Types.signature = really_input ch "Caml1999I010" 0 12; input_value ch let rec dump_expr {Types.id=id; level=level; desc=desc} = match desc with Types.Tarrow (label,t1,t2,_) -> printf "id:%d level:%d label:<%s>\n" id level label; dump_expr t1; dump_expr t2 | _ -> ();; let _ = let filename = Sys.argv.(1) in let name,signs = input_name_sign (open_in_bin filename) in List.iter (function Types.Tsig_type (name,decls,status) -> printf "type '%s'\n" (Ident.name name); | Types.Tsig_value (name,{Types.val_type=expr}) -> printf "val '%s'\n" (Ident.name name); dump_expr expr | _ -> print_endline "<unmatch>") signs
参考
- 過去の30分プログラム
- id:mmatsuoka:20080515