Emacs lisp is missing loop structures familiar to users of newer languages. This library adds a selection of popular loop structures as well as break and continue.
loop.el also has full unit tests.
Table of Contents
Repeatedly evaluate BODY while CONDITION is non-nil.
loop-while
(condition body...)
Example:
(let ((x 0) (sum 0)) ;; sum the numbers 0 to 9 (loop-while (< x 10) (setq sum (+ sum x)) (setq x (1+ x))))
Evaluate BODY, then repeatedly BODY while CONDITION is non-nil.
loop-do-while
(condition body...)
Example:
(let ((x 0) (sum 0)) ;; our condition is false on the first iteration (loop-do-while (and (> x 0) (< x 10)) (setq sum (+ sum x)) (setq x (1+ x))))
Repeatedly evaluate BODY until CONDITION is non-nil.
loop-until
(condition body...)
Example:
(let ((x 0) (sum 0)) ;; sum the numbers 0 to 9 (loop-until (= x 10) (setq sum (+ sum x)) (setq x (1+ x))))
For every item in LIST, evaluate BODY with VAR bound to that item.
loop-for-each
(var list body...)
Example:
(let ((sum 0)) (loop-for-each x (list 1 2 3 4 5 6 7 8 9) (setq sum (+ sum x))))
For every line in the buffer, put point at the start of the line and execute BODY.
loop-for-each-loop
(body...)
Example:
;; Count headings in a markdown buffer. (let ((heading-count 0)) (loop-for-each-line (when (looking-at "#") (setq heading-count (+ heading 1))))
Terminate evaluation of a loop-while
, loop-do-while
, loop-for-each
, or loop-for-each-line
block. If there are nested loops, breaks out of the innermost loop.
loop-break
()
Example:
(let ((sum 0)) ;; sum the numbers 1 to 5 (loop-for-each x (list 1 2 3 4 5 6 7 8 9) (setq sum (+ sum x)) (when (= x 5) (loop-break))) sum)
Skip the rest of the current loop-while
, loop-do-while
, or loop-for-each
block and continue to the next iteration. If there are nested loops, applies to the innermost loop.
loop-continue
()
Example:
(let ((sum 0)) ;; sum the numbers 1, 3, 4, 5 (loop-for-each x (list 1 2 3 4 5) (when (= x 2) (loop-continue)) (setq sum (+ sum x))))
while
and dolist
are built-in loop structurescl-loop
macro in cl-lib
-each
in dash.elloop-for-each-line
now works even if point moves around. Inside loop-for-each-line
, it
is now set to the current line. Added loop-return
.loop-for-each-line
. Also added edebug support, so you can step through loops in loop.el.loop-continue
loop-for-each
now takes three arguments: (VAR LIST BODY...)
loop-until
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4