2016-01-21 32 views
2

假设我有一个用户定义的类型,如type foo = string * string list,如果我想在代码中插入打印调试语句以查看它拥有哪些值,那么最快的方法是什么?在OCaml或Core中是否有通用的调试打印?

似乎写作 let (first, second) = foo in printf "%s, %s" first (String.concat second) 对于快速和脏的调试语句来说太多了!

回答

3

一个选项是使用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))" 

对于没有预先定义的类型,还可以为飞行生成sexp函数。例如:

# [%sexp_of: string * int];; 
- : string * int -> Sexp.t = <fun> 

# [%sexp_of: string * int] ("foo", 42);; 
- : Sexp.t = (foo 42) 
2

您可以尝试在库中的“包括OCaml的电池”的BatPervasives.dump功能。与opam install batteries安装,则:

open Batteries 

type 'a tree = Leaf | Node of 'a * 'a tree * 'a tree 

let t1 = Node(1, Leaf, Leaf) 
let t2 = Node(2, t1, Leaf) 
let t3 = Node(3, Leaf, t2) 

let() = print_endline (dump t3) 

建设有:

ocamlfind ocamlc -package batteries -linkpkg testdump.ml 

或:

ocamlbuild -pkg batteries testdump.byte 

运行它应该会产生:

(3, 0, (2, (1, 0, 0), 0)) 

正如你所看到的,它一个有点精简的代表与REPL输出相比较(它依赖于Obj模块),但如果您知道类型,则通常很容易计算出该值。