У меня есть простая функция, которая печатает строку и завершает работу:
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»?