-
Notifications
You must be signed in to change notification settings - Fork 2
/
defer.cpp
72 lines (64 loc) · 1.27 KB
/
defer.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
// package main
//
// import (
// "fmt"
// "os"
// )
//
// func main() {
// f := createFile("/tmp/defer.txt")
// defer closeFile(f)
// writeFile(f)
// }
//
// func createFile(p string) *os.File {
// fmt.Println("creating")
// f, err := os.Create(p)
// if err != nil {
// panic(err)
// }
// return f
// }
//
// func writeFile(f *os.File) {
// fmt.Println("writing")
// fmt.Fprintln(f, "data")
// }
//
// func closeFile(f *os.File) {
// fmt.Println("closing")
// err := f.Close()
//
// if err != nil {
// fmt.Fprintf(os.Stderr, "error: %v\n", err)
// os.Exit(1)
// }
// }
#include <eo/fmt.h>
using namespace eo;
auto create_file(const std::string& p) -> std::FILE* {
fmt::println("creating");
auto f = std::fopen(p.c_str(), "w");
if (!f) {
throw std::runtime_error(std::strerror(errno));
}
return f;
}
void write_file(std::FILE* f) {
fmt::println("writing");
fmt::fprintln(f, "data");
}
void close_file(std::FILE* f) {
fmt::println("closing");
auto err = std::fclose(f);
if (err) {
fmt::print(stderr, "error: {}\n", err);
std::exit(1);
}
}
func<> eo_main() {
auto f = create_file("/tmp/defer.txt");
eo_defer([&]() { close_file(f); });
write_file(f);
co_return;
}