[Gauche] finallyマクロ

はじめに

Gaucheには、Javaのcatch句に相当するguard式はあるのですが、finally句に相当するものはなさそうなので、マクロの練習がてらつくってみました。

finallyマクロ

以下の通りです。finallyの直後の一連の式は、例外が発生しても、しなくても、必ず実行され(ると思い)ます。

(define-syntax finally
  (syntax-rules ()
    ((finally (expr1 ...) expr2 ...)
    (guard (e (else expr1 ... (raise e))) expr2 ... expr1 ...))))

;; baz
;; quux
;; foo
;; bar
(finally
 ((print "foo") (print "bar"))
 (print "baz")
 (print "quux"))

;; baz
;; foo
;; bar
;; gosh: "error": quux
(finally
 ((print "foo") (print "bar"))
 (print "baz")
 (error "quux"))

備考

プログラミングGauche

プログラミングGauche

では、call/ccを使ってcatchとfinallyを実装しています。