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
|
(defmacro with-resources (:form f res-bindings . body)
(tree-case res-bindings
(((sym init) . rest)
^(let ((,sym ,init))
(with-resources ,rest ,*body)))
(((sym init . cleanup) . rest)
(if (and (plusp sys:compat) (<= sys:compat 265))
^(let ((,sym ,init))
(when ,sym
(unwind-protect
(with-resources ,rest ,*body)
,*cleanup)))
^(let ((,sym ,init))
(unwind-protect
(with-resources ,rest ,*body)
,*cleanup))))
((sym . rest)
^(let (,sym)
(with-resources ,rest ,*body)))
(nil
^(progn ,*body))
(t (compile-error f "bad syntax"))))
(defmacro with-objects (var-init-forms . body)
(let ((gens (mapcar (ret (gensym)) var-init-forms)))
^(let ,gens
(unwind-protect
(let* ,(mapcar (aret ^(,@2 (set ,@1 ,@3))) gens var-init-forms)
,*body)
,*(reverse (mapcar (ret ^(call-finalizers ,@1)) gens))))))
|