blob: f7b72caaebaf41575af32addc6a35571310bea61 (
plain)
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
|
(library (try)
(export try)
(import (rnrs) (sweet-macros))
;; _TRY-EXCEPT
(def-syntax _try-except
(syntax-match (except)
(sub (_try-except expr
(except (e id id* ...) action ...)
...
(except (err) else-action ...))
#'(guard
(err
((or (assertion-violation? err) (error? err))
(case (condition-who err)
((id id* ...) (let ((e err)) action ...))
...
(else else-action ...)
)))
expr))
(sub (_try-except expr
(except (e id id* ...) action ...)
...)
#'(_try-except expr
(except (e id id* ...) action ...)
...
(except (err) (raise err))))
))
;; END
;; _TRY-FINALLY
(def-syntax (_try-finally e e* ... (finally f f* ...))
#'(dynamic-wind
(lambda () #f)
(lambda () e e* ...)
(lambda () f f* ...)))
;; END
;; TRY
(def-syntax try
(syntax-match (except finally)
(sub (try expr (finally f f* ...))
#'(_try-finally expr (finally f f* ...)))
(sub (try expr (except (e id ...) action ...) ...)
#'(_try-except expr (except (e id ...) action ...) ...))
(sub (try expr (except (e id ...) action ...) ... (finally f f* ...))
#'(_try-finally
(_try-except expr (except (e id ...) action ...) ... )
(finally f f* ...)))
))
;; END
)
|