gpt4 book ai didi

logging - 如何使用用户提供的格式字符串在 OCaml printf 之后触发操作

转载 作者:行者123 更新时间:2023-12-02 18:12:23 25 4
gpt4 key购买 nike

我有一个简单的函数,可以打印字符串并退出:

let fatal s = 
print_string "Log: ";
print_endline s;
exit 1

我可以使用 printf 做类似的事情,而无需 exit 1:

let log fmt = 
printf ("Log: " ^^ fmt)

此日志函数采用格式字符串并返回一个函数,该函数采用该格式字符串所需的参数并在前面打印“Log:”。 (当然,对于我的实际应用程序来说,我的前缀并不是这么简单。)

将这两者结合起来并不容易。第一次尝试:

let fatalf fmt =
Printf.printf ("Log: " ^^ fmt)
???
exit 1

问题是我必须返回 printf 表达式的结果,以便可以将剩余的参数应用于它。返回此值后,我就不再具有流控制来运行 exit

printf 格式化程序 %t 看起来很有用,因为它接受一个函数并运行它:

printf ("Log: " ^^ fmt ^^ "%!%t") ... (fun _ -> exit 1)

这似乎不起作用,因为 %t 必须在最后,因此它在写入日志消息后运行,但这意味着退出函数必须在用户指定的参数之后,并且由于无法知道中间会有多少个参数,因此无法生成一个在给定中间参数时完整应用 printf 的闭包。

我记得有一些对命名 printf 参数的支持,但由于有问题而被取消。有什么方法可以模拟这一点,或者实现所需的“任意 printf 后退出”行为?

最佳答案

您正在寻找Printf.kprintf:

let fatalf fmt =
Printf.kprintf (fun str ->
Printf.eprintf "Fatal error: %s !\n%!" str;
exit 1) fmt

kprintf 采用 string -> 'a 类型的延续,并将其应用于具有提供格式的 sprintf-ing 的结果。正如预期的那样,延续的结果是整个调用的结果。

关于logging - 如何使用用户提供的格式字符串在 OCaml printf 之后触发操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6652178/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com