.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))

で、バイトコンパイルすると、cmiとcmoが生成される。

$ 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