假設我有一個用戶定義的類型,如type foo = string * string list
,如果我想在代碼中插入打印調試語句以查看它擁有哪些值,那麼最快的方法是什麼?在OCaml或Core中是否有通用的調試打印?
似乎寫作 let (first, second) = foo in printf "%s, %s" first (String.concat second)
對於快速和髒的調試語句來說太多了!
假設我有一個用戶定義的類型,如type foo = string * string list
,如果我想在代碼中插入打印調試語句以查看它擁有哪些值,那麼最快的方法是什麼?在OCaml或Core中是否有通用的調試打印?
似乎寫作 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))"
對於沒有預先定義的類型,還可以爲飛行生成sexp函數。例如:
# [%sexp_of: string * int];;
- : string * int -> Sexp.t = <fun>
# [%sexp_of: string * int] ("foo", 42);;
- : Sexp.t = (foo 42)
您可以嘗試在庫中的「包括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
模塊),但如果您知道類型,則通常很容易計算出該值。