多相なprintを求めて -その2-

30分プログラム、その202。多相なprintが欲しいので、Obj.tagで分岐してみる。
前回、Objモジュールを使えば、型に関する操作ができそうだということが分ったので、調べてみた。

ここで、Obj.magicとかを適当に説明するつもりだったけど、#006 禁断の Obj - KeisukeNakano’s diaryに書いてあったので、リンクだけを貼ってごまかしておく。

使い方

# to_string 10;;
- : string = "10"

# to_string "hoge";;
- : string = "\"hoge\""

ソースコード

let ($) f g x = f (g x)
let (@@) f g = f g

let to_string x = 
  let r = Obj.repr x in
    if Obj.tag r = Obj.int_tag then
      string_of_int @@ Obj.magic x
    else if Obj.tag r = Obj.double_tag then
      string_of_float @@ Obj.magic x
    else if Obj.tag r = Obj.string_tag then
      "\"" ^ (Obj.magic x) ^ "\""
    else
      "<unknown>"

let print x = print_endline @@ to_string x

リストとかに対応するのは、また次回。