OCaml或Core中是否有通用调试打印?

OCaml或Core中是否有通用调试打印?,ocaml,Ocaml,假设我有一个用户定义的类型,比如type foo=string*string list,如果我想在代码中插入print debug语句以查看它包含的值,那么最快的方法是什么 好像在写 让(第一,第二)=foo进来 首先打印“%s,%s”(第二个为String.concat) 对于一个快速而肮脏的调试语句来说,这是一种太多的工作了 一个选项是使用ppx\u sexp\u conv。如果您使用的是Core,则无需执行任何特殊操作。加载core可以满足您的所有需求。只需将[@@dering sex

假设我有一个用户定义的类型,比如
type foo=string*string list
,如果我想在代码中插入print debug语句以查看它包含的值,那么最快的方法是什么

好像在写

让(第一,第二)=foo进来
首先打印“%s,%s”(第二个为String.concat)

对于一个快速而肮脏的调试语句来说,这是一种太多的工作了

一个选项是使用
ppx\u sexp\u conv
。如果您使用的是
Core
,则无需执行任何特殊操作。加载
core
可以满足您的所有需求。只需将
[@@dering 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_of: string * int];;
- : string * int -> Sexp.t = <fun>

# [%sexp_of: string * int] ("foo", 42);;
- : Sexp.t = (foo 42)
#键入foo=string*字符串列表[@@dering sexp];;
类型foo=string*字符串列表
val foo\u of_sexp:sexp.t->foo=
val sexp_of_foo:foo->sexp.t=
#让foo=“你好”[“你好”;“你”];;
val-foo:string*string list=(“你好”、[“你好”;“你”])
#sexp_of_foo foo |>sexp.to_string_hum;;
-:string=“(你好(你好))”
还可以为未预定义的类型动态生成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_of: string * int];;
- : string * int -> Sexp.t = <fun>

# [%sexp_of: string * int] ("foo", 42);;
- : Sexp.t = (foo 42)
#[%sexp\u of:string*int];;
-:string*int->Sexp.t=
#[%sexp_of:string*int](“foo”,42);;
-:Sexp.t=(foo 42)

您可以尝试“包含OCaml电池”库中的
BatPervasives.dump
功能。使用opam安装电池安装,然后:

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
或:

运行它应该产生:

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

如您所见,与REPL输出相比,它是一种有点精简的表示形式(它依赖于
Obj
模块),但如果您知道类型,通常很容易计算出值。

这不属于核心,而是一个简化类型驱动代码生成的库,函数可以满足您的需要,而打印格式更接近JSON而不是SEXPs

从文档:

#类型文件={
名称:字符串;
perm:int[@printer fun fmt->fprintf fmt“0o%03o”];
}[@@s];;
#显示_文件{name=“dir”;perm=0o755};;
-:string=“{name=\“dir\”perm=0o755}”