假设我有一个用户定义的类型,例如type foo = string * string list,如果我想在我的代码中插入打印调试语句以查看它保存的值,那么最快的方法是什么?
let (first, second) = foo in
printf "%s, %s" first (String.concat second)
对于快速而肮脏的调试语句来说,似乎编写
工作太多了!
一种选择是使用ppx_sexp_conv. 如果您使用Core,则无需执行任何特殊操作。加载core将为您提供所需的一切。只需添加[@@deriving sexp]到所有类型定义中即可。例如:
# type foo = string * string list [@@deriving sexp];;
type foo = string * string list
val foo_of_sexp : Sexp.t -> foo = <fun>
val sexp_of_foo : foo -> Sexp.t = <fun>
# let foo = "hello", ["how"; "are"; "you"];;
val foo : string * string list = ("hello", ["how"; "are"; "you"])
# sexp_of_foo foo |> Sexp.to_string_hum;;
- : string = "(hello (how are you))"
Run Code Online (Sandbox Code Playgroud)
还可以为未预定义的类型动态生成 sexp 函数。例如:
# [%sexp_of: string * int];;
- : string * int -> Sexp.t = <fun>
# [%sexp_of: string * int] ("foo", 42);;
- : Sexp.t = (foo 42)
Run Code Online (Sandbox Code Playgroud)