%port-request %run %run-at %run-delay
+ catch-8sync catch-%8sync
+
print-error-and-continue
%current-agenda
(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 ...))
+
\f
;;; Execution of agenda, and current agenda
"in here now!\n"
"Well that was fun :)\n")))
+;; Make sure catching tools work
+
+(let ((speaker (speak-it))
+ (catch-result #f))
+ (catch-8sync
+ (begin
+ (speaker "hello")
+ (throw '%8sync-caught-error
+ 'my-orig-key '(apple orange banana) '(*fake-stack* *fake-stack* *fake-stack*))
+ (speaker "no goodbyes"))
+ ('some-key
+ (lambda (stacks . rest)
+ (speaker "should not happen")))
+ ('my-orig-key
+ (lambda (stacks fruit1 fruit2 fruit3)
+ (set! catch-result
+ `((fruit1 ,fruit1)
+ (fruit2 ,fruit2)
+ (fruit3 ,fruit3))))))
+ (test-equal (speaker) '("hello"))
+ (test-equal catch-result '((fruit1 apple)
+ (fruit2 orange)
+ (fruit3 banana))))
+
;; End tests
(test-end "test-agenda")
+;; @@: A better way to handle this at the repl?
(test-exit)