Code that requires break
statements or continue
statements in other languages can be done with block
& return-from
or catch
& throw
in Common Lisp and Emacs Lisp. Then there is code that requires redo
statements, or at least best written with redo
. And redo
statements don't have to be about loops. How can I do redo
in Lisp?
If there was a redo
equivalent in Lisp, I think it would work like this: special form with-redo
which takes a symbol and forms, and redo
which takes a symbol. The form (with-redo 'foo BODY-FORMS...)
may contain (redo 'foo)
in its BODY-FORMS, and (redo 'foo)
transfers control back to the beginning of BODY-FORMS.
In Common Lisp:
(tagbody
start
(do-something)
(go start))
(dotimes (i some-list)
redo
(when (some-condition-p)
(go redo))
(some-more))