多相な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
参考
- 過去の30分プログラム
- 多相なprintを求めて -その1- (id:mzp:20071211:obj)
- 多相なprintを求めて -その2- (id:mzp:20071212:print)