Legend:
Page
Library
Module
Module type
Parameter
Class
Class type
Source
    Page
Library
Module
Module type
Parameter
Class
Class type
Source
OCaml implementation of the KDL Document Language v2.
$ opam install kdlExample:
# let kdl = Kdl.of_string {|
    contents {
      section "First section" {
        paragraph "This is the first paragraph"
        paragraph "This is the second paragraph"
      }
    }
  |}
val kdl : (Kdl.t, Kdl.error) result = Ok
 [{Kdl.name = "contents"; annot = None; args = []; props = [];
   children =
    [{Kdl.name = "section"; annot = None;
      args = [(None, `String "First section")]; props = [];
      children =
       [{Kdl.name = "paragraph"; annot = None;
         args = [(None, `String "This is the first paragraph")]; props = [];
         children = []};
        {Kdl.name = "paragraph"; annot = None;
         args = [(None, `String "This is the second paragraph")]; props = [];
         children = []}]}]}]Convert to a sexp-expression (uses the sexplib0 library):
# Kdl.sexp_of_t kdl |> Sexplib0.Sexp.to_string_hum |> print_endline
(contents
 (children
  (section (string "First section")
   (children (paragraph (string "This is the first paragraph"))
    (paragraph (string "This is the second paragraph"))))))Pretty-print the KDL document back:
# Kdl.to_string kdl |> print_endline
contents {
  section "First section" {
    paragraph "This is the first paragraph"
    paragraph "This is the second paragraph"
  }
}Similar to to.ml, ocaml-kdl provides lenses. The lenses can be composed using // or |--:
# let open Kdl.L in
  kdl.@(top // child "section" // child_nth 1 // first_arg // string_value)
- : string option = Some "This is the second paragraph"Additionaly, type-annotated values can be "interpreted":
# let parsed = Kdl.of_string_exn "- (u8)220"
# Kdl.interpret Kdl.L.(parsed.@!(node "-" // first_arg))
- : [> Kdl.typed_value ] = `U8 220For the full list of available functions, see the mli file.