diff options
author | Chaos Eternal <chaos@shlug.org> | 2017-08-18 16:27:30 +0800 |
---|---|---|
committer | Chaos Eternal <chaos@shlug.org> | 2017-08-18 17:00:32 +0800 |
commit | 1bb0a878513ffeac666205b96b92174323322eae (patch) | |
tree | 4364ca66a49f2798c0d829f191c60b8e39f89f5f /scheme/chez | |
parent | 2fb484bac916304c255580fcb9feb3b9cc771ac3 (diff) | |
download | geiser-chez-1bb0a878513ffeac666205b96b92174323322eae.tar.gz geiser-chez-1bb0a878513ffeac666205b96b92174323322eae.tar.bz2 |
Handle exceptions of ChezScheme and multi-value as well
- Capture exceptions of ChezScheme
- handles multi-value return
Diffstat (limited to 'scheme/chez')
-rw-r--r-- | scheme/chez/geiser/geiser.ss | 31 |
1 files changed, 27 insertions, 4 deletions
diff --git a/scheme/chez/geiser/geiser.ss b/scheme/chez/geiser/geiser.ss index 2fa648c..6568120 100644 --- a/scheme/chez/geiser/geiser.ss +++ b/scheme/chez/geiser/geiser.ss @@ -30,11 +30,34 @@ (define (geiser:eval module form . rest) rest - (let ((result (if module - (eval form (environment module)) - (eval form)))) + (let* ((try-eval (lambda (x . y) + (call/cc + (lambda (k) + (with-exception-handler + (lambda (e) + (k e)) + (lambda () + (if (null? y) (eval x) + (eval x (car y))) + )))))) + (result-mid (call-with-values + (lambda () (if module + (try-eval form (environment module)) + (try-eval form))) + (lambda (x . y) + (if (null? y) + x + (cons x y))))) + (result result-mid) + (error (if (condition? result-mid) + (cons 'error (list + (cons 'key + (with-output-to-string + (lambda () (display-condition result-mid)))))) + '()))) (write `((result ,(write-to-string result)) - (output . ""))) + (output . "") + ,error)) (newline))) (define (geiser:module-completions prefix . rest) |