Emacs Lisp: Sequence Iteration
Map: mapcar
(mapcar FUNCTION SEQUENCE)
-
Apply function to each element of
Sequence
, and return the result as a list.
;; apply the function car to each sublist (take 1st element) (equal (mapcar 'car '((1 2) (3 4) (5 6))) '(1 3 5)) ;; apply a lambda to each vector (take 1st element) (equal (mapcar (lambda (x) (aref x 0)) [[1 2] [3 4] [5 6]]) '(1 3 5)) ;; apply the function 1+ to each vector element (equal (mapcar '1+ [0 1 2]) '(1 2 3))
mapc (for-each)
mapc
-
(mapc FUNCTION SEQUENCE)
Like
mapcar
, but return nil.(mapc (lambda (x) (insert (number-to-string x))) (number-sequence 1 9)) ;; insert 123456789
;; apply a file function to a list of files (mapc 'my-update-footer (list "~/x1.html" "~/x2.html" "~/x3.html"))
dotimes: Loop Fixed Number of Times with Index
(dotimes (VAR COUNT) BODY)
-
Loop a certain number of times. Evaluate BODY with VAR bound to successive integers running from 0, inclusive, to COUNT, exclusive. Return nil
Tip:
dotimes
is useful when you need the index of a list.(dotimes (i 4) (insert (number-to-string i))) ;; inserts "0123", return nil
(let ((xx [3 4 5])) (dotimes (i (length xx)) (insert (number-to-string (elt xx i))))) ;; inserts 345
(dotimes (VAR COUNT RESULT) BODY)
- After loop, evaluate RESULT to get the return value.
dolist: Loop Thru a List
(dolist (VAR LIST) BODY)
-
Loop over a list. Evaluate BODY with VAR bound to each element from LIST, return nil.
(setq xx (number-sequence 1 5)) (dolist (n xx) (insert (number-to-string n))) ;; inserts 12345 ;; return nil
(dolist (VAR LIST RESULT) BODY)
- return RESULT.
While-Loop
Another common form to loop thru a list is using the while
function. In each iteration, pop
is used to reduce the list.
(let ((xx '(a b c))) (while xx (message "%s" (pop xx)) (sleep-for 1)))
Example with vector:
(let (xx ii) (setq xx [0 1 2 3 4 5]) (setq ii 0) (while (< ii (length xx)) (insert (format "%d" (aref xx ii))) (setq ii (1+ ii)))) ; inserts 012345