The*_*ema 3 logging printf ocaml
我有一个简单的函数,打印一个字符串并退出:
let fatal s =
print_string "Log: ";
print_endline s;
exit 1
Run Code Online (Sandbox Code Playgroud)
我可以使用printf做类似的事情而不用exit 1:
let log fmt =
printf ("Log: " ^^ fmt)
Run Code Online (Sandbox Code Playgroud)
此日志函数采用格式字符串并返回一个函数,该函数获取该格式字符串所需的参数并在前面打印"Log:".(当然,我的前缀对于我的实际应用来说并不是那么简单.)
把这两者结合起来并不容易.第一次尝试:
let fatalf fmt =
Printf.printf ("Log: " ^^ fmt)
???
exit 1
Run Code Online (Sandbox Code Playgroud)
问题是我必须返回printf表达式的结果,以便可以将其余参数应用于它.一旦我返回了这个值,我就没有流量控制了exit.
printf格式化程序%t看起来很有用,因为它需要一个函数并运行它:
printf ("Log: " ^^ fmt ^^ "%!%t") ... (fun _ -> exit 1)
Run Code Online (Sandbox Code Playgroud)
这似乎不是%t必须最后工作,因此它在写入日志消息后运行,但这意味着退出函数必须在用户指定的参数之后,并且因为无法知道将有多少参数干预时,在给出干预论点时,不能产生完全应用printf的闭包.
我记得有一些支持命名的printf参数,但这是因为它是错误的.有没有办法模仿,或实现所谓的"任意printf后退出"行为?
小智 8
您正在寻找Printf.kprintf:
let fatalf fmt =
Printf.kprintf (fun str ->
Printf.eprintf "Fatal error: %s !\n%!" str;
exit 1) fmt
Run Code Online (Sandbox Code Playgroud)
kprintf采用类型的延续,string -> 'a并将其应用于sprintf提供格式的-ing 结果.正如预期的那样,延续的结果是整个调用的结果.