Implementing CATCH and OOPS

top right

(define (eval-catch exp env)
  ;; (CATCH name normal error)
  (let ((labels *labels*))
    (define (done)
      (set! *labels* labels)
      (eval (fourth exp) env))
    (add-label (second exp) done)
    (let ((result (eval (third exp) env)))
      (set! *labels* labels)
      result)))

(define (eval-oops exp env)
  ;; (OOPS name)
  (let ((label (find-label (second exp))))
      (if label
          (label)
          (error "No handler for error" name))))

Jim Miller W3C