This package provides a PPX that allows to derive cast functions based on their types.
[%madcast: ('a * string) -> ('a * int)] would be replaced by:
fun (x, y) -> (x, try int_of_string y with Failure _ -> failwith "madcast: string -> int")
Published: 09 Feb 2023
Madcast is a library deriving cast functions based on their types.
For base types, Madcast uses the functions defined in the standard library:
[%madcast: int -> string]
will simply be replaced by
Say you have to parse a line of coordinates x1, y1, x2, y2, etc. and you want an array of pairs of integers:
let points = read_line () |> String.split_on_char ' ' |> [%madcast: string list -> (int * int) array]
Madcast is primarily meant to be used in conjunction with low level API. Here is an example with MySQL:
let () = let result = Mysql.exec conn "SELECT id, name, surname FROM person WHERE username='johndoe'" in let row = Mysql.fetch result |> [%madcast: string option array option -> (int * string * string option) option] in match row with | None -> Format.eprintf "Could not find user `johndoe`@." | Some (id, name, None) -> Format.eprintf "%s (%d) has no surname.@." name id | Some (id, name, Some surname) -> Format.eprintf "%s (%d) has %s for surname.@." name id surname
Try it yourself!
You can see by yourself the code generated for a given type with
$ dune exec test/show.exe 'string array -> (int * int) array' fun a -> if ((Array.length a) mod 2) <> 0 then failwith "madcast: 'a array -> <tuple> array" else Array.init ((Array.length a) / 2) (fun i -> (((fun s -> try int_of_string s with | Failure _ -> failwith "madcast: string -> int") (a.(0 + (i * 2)))), ((fun s -> try int_of_string s with | Failure _ -> failwith "madcast: string -> int") (a.(1 + (i * 2))))))
Actually, if you feel fancy, we recommend adding
bat to the lot and running:
$ dune exec test/show.exe 'string list -> (int * int) array' \ | ocamlformat - --impl --enable-outside-detected-project \ | bat --language ocaml
And if you don't feel like cloning but you love Nix, you can also go for:
$ nix run github:LesBoloss-es/ppx_deriving_madcast#show -- 'string array -> (int * int) array'
ppx_deriving_madcast is available on OPAM:
$ opam install ppx_deriving_madcast
Madcast also provides an API. This API is in the package
ppx_deriving_madcast.api. Its documentation can be built with
Madcast is distributed under the LGPL License, version 3.