(macro (catch form)
       (let ((label (gensym)))
         `(call/cc (lambda (exit)
                     (push-handler (lambda () (exit ,(cadr form))))
                     (let ((,label (begin ,@(cddr form))))
                       (pop-handler)
                       ,label)))))