(module exn mzscheme
(require-for-syntax (file "syntax.ss"))
(require (lib "list.ss" "srfi" "1"))
(require (only (planet "text-ui.ss" ("schematics" "schemeunit.plt" 2)) display-exn))
(provide display-exn
raise-exn
raise-exn/append
raise-exn/format
reraise-exn)
(define-syntax (raise-exn stx)
(syntax-case stx ()
[(_ exception message extra-args ...)
(with-syntax ([make-proc (make-syntax-symbol stx 'make- (syntax exception))])
#'(raise (apply make-proc
(list (string->immutable-string message)
(current-continuation-marks)
extra-args ...))))]))
(define-syntax (raise-exn/append stx)
(syntax-case stx ()
[(_ exception message messages ...)
(with-syntax ([make-proc (make-syntax-symbol stx 'make- (syntax exception))])
(syntax
(raise
(make-proc
(string->immutable-string (string-append message messages ...))
(current-continuation-marks)))))]))
(define-syntax (raise-exn/format stx)
(syntax-case stx ()
[(_ exception template params ...)
(with-syntax ([make-proc (make-syntax-symbol stx 'make- (syntax exception))])
(syntax
(raise
(make-proc
(string->immutable-string (format template params ...))
(current-continuation-marks)))))]))
(define-syntax (reraise-exn stx)
(syntax-case stx ()
[(_ old-exn new-exn message constructor-args ...)
(with-syntax ([make-proc (make-syntax-symbol #'new-exn 'make- (syntax new-exn))])
#'(raise (make-proc (string->immutable-string (string-append message ": " (exn-message old-exn)))
(exn-continuation-marks old-exn)
constructor-args ...)))]))
)