;;; srfi-34.scm --- Exception handling for programs
-;; Copyright (C) 2003, 2006, 2008 Free Software Foundation, Inc.
+;; Copyright (C) 2003, 2006, 2008, 2010 Free Software Foundation, Inc.
;;
;; This library is free software; you can redistribute it and/or
;; modify it under the terms of the GNU Lesser General Public
;;; Code:
(define-module (srfi srfi-34)
- #:export (with-exception-handler
- raise)
+ #:export (with-exception-handler)
+ #:replace (raise)
#:export-syntax (guard))
(cond-expand-provide (current-module) '(srfi-34))
handler's continuation is otherwise unspecified."
(throw throw-key obj))
-(define-macro (guard var+clauses . body)
- "Syntax: (guard (<var> <clause1> <clause2> ...) <body>)
+(define-syntax guard
+ (syntax-rules (else)
+ "Syntax: (guard (<var> <clause1> <clause2> ...) <body>)
Each <clause> should have the same form as a `cond' clause.
Semantics: Evaluating a guard form evaluates <body> with an exception
clause, then raise is re-invoked on the raised object within the
dynamic environment of the original call to raise except that the
current exception handler is that of the guard expression."
- (let ((var (car var+clauses))
- (clauses (cdr var+clauses)))
- `(catch ',throw-key
- (lambda ()
- ,@body)
- (lambda (key ,var)
- (cond ,@(if (eq? (caar (last-pair clauses)) 'else)
- clauses
- (append clauses
- `((else (throw key ,var))))))))))
+ ((guard (var clause ... (else e e* ...)) body body* ...)
+ (catch throw-key
+ (lambda () body body* ...)
+ (lambda (key var)
+ (cond clause ...
+ (else e e* ...)))))
+ ((guard (var clause clause* ...) body body* ...)
+ (catch throw-key
+ (lambda () body body* ...)
+ (lambda (key var)
+ (cond clause clause* ...
+ (else (throw key var))))))))
+
;;; (srfi srfi-34) ends here.