多相な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
リストとかに対応するのは、また次回。
参考
- 過去の30分プログラム
- id:mzp:20071211:obj