OCamlでprintデバッグしたい
OCaml で print デバッグを行う際は let _ = Printf.printf ... in の形で printf を差し込むと良い。
code:ocaml
let rec gcd a b =
(* こんな感じ *)
let _ = Printf.printf "a = %d, b = %d\n" a b in
if a = 0 && b = 0 then 0
else if b = 0 then a
else
let r = a mod b in
if r = 0 then
b
else
gcd b r
なぜ let _ = ... in が必要?
以下のように let _ = ... in 無しに printf を差し込むことも可能なんだけど、
code:ocaml
let rec gcd a b =
(* 通常は print のあとにセミコロンを入れれば良いのだけど... *)
Printf.printf "a = %d, b = %d\n" a b;
if a = 0 && b = 0 then 0
else if b = 0 then a
else
let r = a mod b in
if r = 0 then
b
else
gcd b r
差し込む場所によっては (Printf.printf "r = %d\n" r; gcd b r) のようにカッコで囲って1つの式であることを明示する必要がある(printf を差し込んで構文エラーが出たらカッコで囲ってみよう)。
カッコで囲う場合、printf のつけ外しの際に printf だけでなく前後のカッコも外す必要があるため、printf つけ外し負荷が高い。
code:ocaml
let rec gcd a b =
if a = 0 && b = 0 then 0
else if b = 0 then a
else
let r = a mod b in
if r = 0 then
b
else
(* 構文解析の都合上、カッコで囲う必要がある場合もある *)
(Printf.printf "r = %d\n" r;
gcd b r)
let in を使うとカッコが不要でしあわせ
カッコで囲う代わりに let _ = Printf.printf ... in を使って printf を差し込むことも可能。
code:ocaml
let rec gcd a b =
if a = 0 && b = 0 then
0
else if b = 0 then
a
else
let r = a mod b in
if r = 0 then
b
else
(* let in を使えばカッコは不要 *)
let _ = Printf.printf "r = %d\n" r in
gcd b r
print をコメントアウトする場合は let in の行だけコメントアウトすればOKなので、print のつけ外しが容易でしあわせ。
code:ocaml
let rec gcd a b =
if a = 0 && b = 0 then
0
else if b = 0 then
a
else
let r = a mod b in
if r = 0 then
b
else
(* let の行だけコメントアウトすれば OK *)
(* let _ = Printf.printf "r = %d\n" r in *)
gcd b r
追記
ppx_deriving を使うと良いみたい。あとで調べよう。