Guest User

Untitled

a guest
Jun 11th, 2018
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lisp 0.80 KB | None | 0 0
  1. (defmacro retry-times (n timeout-secs &body body)
  2.   (let ((i-sym (gensym "i"))
  3.         (ex-sym (gensym "ex"))
  4.         (loop-ex-sym (gensym "loop-ex"))
  5.         (loop-tag-sym (gensym "loop-tag"))
  6.         (timeout-secs (or timeout-secs 1)))
  7.     `(loop
  8.         named ,loop-tag-sym
  9.         with ,loop-ex-sym = nil
  10.         for ,i-sym below ,n
  11.         do
  12.           (handler-case
  13.               (progn
  14.                 (setf ,loop-ex-sym nil)
  15.                 (return-from ,loop-tag-sym
  16.                   (progn ,@body)))
  17.             (error (,ex-sym)
  18.               (setf ,loop-ex-sym ,ex-sym)
  19.               (format nil "failed with ~A retrying ~D/~D... ~%"
  20.                       ,ex-sym (1+ ,i-sym) ,n)
  21.               (sleep ,timeout-secs)))
  22.         while ,loop-ex-sym
  23.         finally (error ,loop-ex-sym))))
Add Comment
Please, Sign In to add comment