I am trying to understand Scanf.format_of_string s fmt
but it seems my intuition is failing me. What is the second parameter and how do I use it? I tried a simple example below but it is failing.
utop> let f = Scanf.format_from_string "" "%s";;
"Exception:
Stdlib.Scanf.Scan_failure
"bad input: format type mismatch between \"\" and \"%s\"".
My understanding is the s
parameter is of a string type. No?
1 Like
format_from_string s fmt
converts a string argument to a format string, according to the given format string fmt
.
Raises Scan_failure
if s
, considered as a format string, does not have the same type as fmt
.
The key fact is that s
must have the matching type when considered as a format string. In your case, s
corresponds to a zero-argument format string and fmt
to a one-argument format string, so the exception is raised.
The format string fmt
acts as a kind of dummy placeholder to provide the right type for the result of interpreting s
, as a kind of run-time equivalent of the Stdlib.format_of_string
function.
# let dummy_fmt : (_, _, _) format = "{ foo : %d; bar : %s }\n"
(* Use [dummy_fmt] to supply expected type information of new format *)
let reified_fmt = Scanf.format_from_string ("{ new_foo : %d; new_bar : %s }\n" : string) dummy_fmt
let () =
Printf.printf dummy_fmt 1 "alpha" ;
Printf.printf reified_fmt 2 "beta" ;;
{ foo : 1; bar : alpha }
{ new_foo : 2; new_bar : beta }
Thanks for the explanation.
1 Like