X-Git-Url: https://jxself.org/git/?p=8sync.git;a=blobdiff_plain;f=eightsync%2Fagenda.scm;h=9f54e17aa06ca2faf76c652de922e803bfb027af;hp=d02ce9fbdb029330308b852ad77ea0b84c66e405;hb=5a32dfc9d2b5a5b873d57ecdbf29f68a136cb0b0;hpb=b338e79df344d5acc44bd6768eddba254ad59554 diff --git a/eightsync/agenda.scm b/eightsync/agenda.scm index d02ce9f..9f54e17 100644 --- a/eightsync/agenda.scm +++ b/eightsync/agenda.scm @@ -65,6 +65,14 @@ %port-request %run %run-at %run-delay + catch-8sync catch-%8sync + + ;; used for introspecting the error, but a method for making + ;; is not exposed + wrapped-exception? + wrapped-exception-key wrapped-exception-args + wrapped-exception-stacks + print-error-and-continue %current-agenda @@ -468,20 +476,19 @@ return the wrong thing via (%8sync) and trip themselves up." async-request)))) (define-record-type - (make-wrapped-exception key args stack) + (make-wrapped-exception key args stacks) wrapped-exception? (key wrapped-exception-key) (args wrapped-exception-args) - (stack wrapped-exception-stack)) + (stacks wrapped-exception-stacks)) (define-syntax-rule (propagate-%async-exceptions body) (let ((body-result body)) - (display "hi!\n") (if (wrapped-exception? body-result) - (throw '%8sync-caught-error + (throw '8sync-caught-error (wrapped-exception-key body-result) (wrapped-exception-args body-result) - (wrapped-exception-stack body-result)) + (wrapped-exception-stacks body-result)) body-result))) (define-syntax-rule (%run body ...) @@ -511,10 +518,17 @@ return the wrong thing via (%8sync) and trip themselves up." ;; If something bad happened and we didn't catch it, ;; we'll wrap it up in such a way that the continuation ;; can address it - ;; @@: For this stack to work doesn't it have to be (lambda (key . args) - (make-wrapped-exception key args - exception-stack)) + (cond + ((eq? key '8sync-caught-error) + (match args + ((orig-key orig-args orig-stacks) + (make-wrapped-exception + orig-key orig-args + (cons exception-stack orig-stacks))))) + (else + (make-wrapped-exception key args + (list exception-stack))))) (lambda _ (set! exception-stack (make-stack #t 1 0))))))) when)))) @@ -536,6 +550,22 @@ return the wrong thing via (%8sync) and trip themselves up." (lambda () body ...))))) +(define-syntax-rule (catch-8sync exp (handler-key handler) ...) + (catch '8sync-caught-error + (lambda () + exp) + (lambda (_ orig-key orig-args orig-stacks) + (cond + ((or (eq? handler-key #t) + (eq? orig-key handler-key)) + (apply handler orig-stacks orig-args)) ... + (else (raise '8sync-caught-error + orig-key orig-args orig-stacks)))))) + +;; Alias...? +(define-syntax-rule (catch-%8sync rest ...) + (catch-8sync rest ...)) + ;;; Execution of agenda, and current agenda