Sorry for novice question but I need some help converting old code:
to use ppx
%finally syntax and could not make it work. How the code above should be rewritten?
P.S. I do not need to catch/process exceptions. Just need to make sure finally block is always exectured.
Lwt.finalize is what you’re looking for
Lwt.finalize and used it as a workaround. I wanted to see if there is a way to use PPX extension to make look nicer. lwt.ppx documtnatoion mentions both
@vzaliva there is an example in the proposed new module
Lwt docs here:
let () =
let%lwt file = Lwt_io.(open_file Input "code.ml") in
let%lwt content = Lwt_io.read file in
(* ocamlfind opt -linkpkg -package lwt.ppx,lwt.unix code.ml && ./a.out *)
This doesn’t actually use
try%lwt, because it’s not necessary to use with
%lwt.finally. By the way, you should always use it as
%lwt.finally, not just
To use with
try%lwt, you’d put a
try%lwt expression in the inner
begin...end. If you consider
begin...end to be ugly, like many people do, you can use ordinary parentheses instead.
Yes, that helped! Thanks @antron. Apparently square bracked around
lwt.finally is what required. Would you care to explain to me the magic? Why square brackets? Is this
ppx thing? Is it specific to
lwt.ppx? Just curious.
lwt.finally are Lwt-specific, of course, but the rest is the standard PPX API. You may benefit from reading these:
There is also a discussion of why this syntax was chosen for Lwt here.
Basically, expression attributes (
expr [%...attribute...]) are the only good way to attach PPX syntax to expressions. That’s why it was chosen, so that
lwt.finally is associated with one expression. We can’t freely add a new keyword, as could be done in Camlp4.