( ) Core.Std s; LISP s- Core.Std s- ( ). 17 Real World OCaml.
, s- ( , diff). Core_extended.Std.Sexp.Diff.
:
open Core.Std (* basic Sexp functionality. *)
module XSexp = Core_extended.Std.Sexp (* for Sexp diffs. *)
type example = {
a: string;
b: int;
c: float;
} with sexp (* syntax extension *)
let v1 = { a = "foo"; b = 1; c = 3.14 }
let v2 = { a = "bar"; b = 2; c = 3.14 }
let print_sexp s = print_endline (Sexp.to_string_hum s)
let sexp_diff s1 s2 =
match XSexp.Diff.of_sexps ~original:s1 ~updated:s2 with
None -> ""
| Some(diff) -> XSexp.Diff.to_string diff
let main () =
let s1 = sexp_of_example v1 in
let s2 = sexp_of_example v2 in
print_endline "=== first sexp ===";
print_sexp s1;
print_endline "=== second sexp ===";
print_sexp s2;
print_endline "=== print_diff output ===";
XSexp.print_diff ~oc:stdout ~original:s1 ~updated:s2 ();
print_endline "=== sexp_diff output ===";
print_endline (sexp_diff s1 s2)
let () = main ()
print_diff - diff , sexp_diff - , Sexp.Diff diff . corebuild -pkg core_extended example.native ( .byte ocamlbuild ) :
((a foo) (b 1) (c 3.14))
((a bar) (b 2) (c 3.14))
a
- foo
+ bar
b
- 1
+ 2
a
- foo
+ bar
b
- 1
+ 2