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

30分プログラム、その203。多相なprintシリーズの最後。

リストに対応した辺りで、ExtLibのStd.Printを知ったので、ここで終了。

使い方

# to_string [1;2;3];;
- : string = "[1; 2; 3; ]"

ソースコード

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

let to_string x = 
  let t = Obj.tag @@ Obj.repr x in
    if t = Obj.int_tag then
      string_of_int @@ Obj.magic x
    else if t = Obj.double_tag then
      string_of_float @@ Obj.magic x
    else if t = Obj.string_tag then
      "\"" ^ (Obj.magic x) ^ "\""
    else if t = 0 then (* cons *)
      "[" ^ (string_of_list @@ Obj.magic x) ^ "]"
    else
      "<unknown>"

let rec string_of_list = function
    []    -> ""
  | x::xs -> (to_string x) ^ "; " ^ string_of_list xs

let print x = print_endline @@ to_string x

参考