Function: iter-do

iter-do is a macro defined in generator.el.gz.

Signature

(iter-do (VAR ITERATOR) &rest BODY)

Documentation

Loop over values from an iterator.

Evaluate BODY with VAR bound to each value from ITERATOR. Return the value with which ITERATOR finished iteration.

View in manual

Source Code

;; Defined in /usr/src/emacs/lisp/emacs-lisp/generator.el.gz
(cl-defmacro iter-do ((var iterator) &rest body)
  "Loop over values from an iterator.
Evaluate BODY with VAR bound to each value from ITERATOR.
Return the value with which ITERATOR finished iteration."
  (declare (indent 1)
           (debug ((symbolp form) &rest sexp)))
  (let ((done-symbol (cps--gensym "iter-do-iterator-done"))
        (condition-symbol (cps--gensym "iter-do-condition"))
        (it-symbol (cps--gensym "iter-do-iterator"))
        (result-symbol (cps--gensym "iter-do-result")))
    `(let (,result-symbol
           (,done-symbol nil)
           (,it-symbol ,iterator))
       (while
           (let ((,var
                  (condition-case ,condition-symbol
                      (iter-next ,it-symbol)
                    (iter-end-of-sequence
                     (setf ,result-symbol (cdr ,condition-symbol))
                     (setf ,done-symbol t)))))
             (unless ,done-symbol
               ,@body
               ;; Loop until done-symbol is set.
               t)))
       ,result-symbol)))