mirror of
git://git.gnupg.org/gnupg.git
synced 2025-07-02 22:46:30 +02:00
gpgscm: Add 'finally', rework all macros.
* tests/gpgscm/init.scm (finally): New macro. * tests/gpgscm/tests.scm (letfd): Rewrite. (with-working-directory): Likewise. (with-temporary-working-directory): Likewise. (lettmp): Likewise. -- Rewrite all our macros using 'define-macro'. Use the new control flow mechanism 'finally', or 'dynamic-wind' where appropriate. Make sure the macros are hygienic. Reduce code duplication. Signed-off-by: Justus Winter <justus@g10code.com>
This commit is contained in:
parent
e8b843508d
commit
b79274a3b7
2 changed files with 51 additions and 43 deletions
|
@ -569,6 +569,16 @@
|
|||
; the thrown exception is bound to *error*. Errors can be rethrown
|
||||
; using (rethrow *error*).
|
||||
;
|
||||
; Finalization can be expressed using "finally":
|
||||
;
|
||||
; (finally (finalize-something called-purely-for side-effects)
|
||||
; (whether-or-not something goes-wrong)
|
||||
; (with-these calls))
|
||||
;
|
||||
; The final expression is executed purely for its side-effects,
|
||||
; both when the function exits successfully, and when an exception
|
||||
; is thrown.
|
||||
;
|
||||
; Exceptions are thrown with:
|
||||
;
|
||||
; (throw "message")
|
||||
|
@ -622,6 +632,13 @@
|
|||
(pop-handler)
|
||||
,label)))))
|
||||
|
||||
(define-macro (finally final-expression . expressions)
|
||||
(let ((result (gensym)))
|
||||
`(let ((,result (catch (begin ,final-expression (rethrow *error*))
|
||||
,@expressions)))
|
||||
,final-expression
|
||||
,result)))
|
||||
|
||||
;; Make the vm use throw'.
|
||||
(define *error-hook* throw')
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue