Я пишу код для мониторинга содержимого файла. Когда программа достигает конца файла, я хочу, чтобы она завершилась чисто.
let log () : input_channel Lwt.t =
openfile "log" [O_RDONLY] 0 >>= fun fd ->
Lwt.return (of_fd input fd);;
let rec loop (ic: input_channel) = Lwt_io.read_line ic >>= fun text ->
Lwt_io.printl text >>= fun _ -> loop ic;;
let monitor () : unit Lwt.t = log () >>= loop;;
let handler : exn -> unit Lwt.t = fun e -> match e with
| End_of_file -> let (p: unit Lwt.t), r = Lwt.wait() in p
| x -> Lwt.fail x;;
let main () : unit Lwt.t = Lwt.catch monitor handler;;
let _ = Lwt_main.run (main ());;
Однако при чтении файла и достижении конца программа не завершается, а просто зависает, и мне приходится выходить с помощью Ctrl+c. Я не уверен, что происходит под капотом с bind, но я понял, что бы он ни делал, в конечном итоге Lwt_io.readline ic
должен в конечном итоге достичь конца файла и вернуть исключение End_of_file
, которое предположительно будет передано обработчику и т. д.
Если бы мне пришлось угадывать разрешение, я бы подумал, может быть, в последнюю привязку определения >>=
я бы включил некоторую проверку if
. Но я бы проверил, я думаю, вернул ли Lwt_io.read_line
End_of_file
, который, как мне кажется, должен обрабатываться handler
.