Alternate guard form - evaluate the guard clauses in the continuation of the raise.

We need to override the current-exception-handler and still pass a thunk to be
applied on return, but this allows us to print stack traces inside guards.
This commit is contained in:
Alex Shinn 2013-04-03 00:18:58 +09:00
parent af8aed4c5a
commit 0f723c17ea

View file

@ -923,22 +923,26 @@
(define-syntax guard (define-syntax guard
(syntax-rules () (syntax-rules ()
((guard (var clause ...) e1 e2 ...) ((guard (var clause ...) e1 e2 ...)
((call-with-current-continuation (let ((orig-handler (current-exception-handler)))
(lambda (guard-k) ((call-with-current-continuation
(with-exception-handler (lambda (guard-k)
(lambda (condition) (with-exception-handler
((call-with-current-continuation (lambda (condition)
(lambda (handler-k) ((call-with-current-continuation
(guard-k (lambda (handler-k)
(lambda () (let* ((var condition) ; clauses may set! var
(let ((var condition)) (res
(guard-aux (handler-k (lambda () (with-exception-handler
(raise-continuable condition))) orig-handler
clause ...)))))))) (lambda ()
(lambda () (guard-aux
(call-with-values (lambda () e1 e2 ...) (handler-k (lambda ()
(lambda args (raise-continuable condition)))
(guard-k (lambda () (apply values args))))))))))))) clause ...)))))
(guard-k (lambda () res)))))))
(lambda ()
(let ((res (begin e1 e2 ...)))
(guard-k (lambda () res))))))))))))
(define-syntax guard-aux (define-syntax guard-aux
(syntax-rules (else =>) (syntax-rules (else =>)