Итерация
Итерация означает многократное выполнение части программы. Например, вы можете захотеть повторить вычисление один раз для каждого элемента списка или один раз для каждого целого числа от 0 до n. Вы можете сделать это в Emacs Lisp с помощью специального оператора while:
- Специальный оператор: while условия…
-
whileсначала оценивает условие. Если результат неnil, он оценивает операции в текстовом порядке. Затем он повторно оценивает условие, и если результат неnil, он повторно оценивает операции. Этот процесс повторяется до тех пор, пока условие не будет равноnil.Нет ограничений на количество итераций. Цикл будет продолжаться, пока условие не примет значение
nilили пока не произойдет ошибка илиthrowпрервет его (см. Нелокальные завершения).Значение оператора
whileвсегдаnil.(setq num 0) ⇒ 0(while (< num 4) (princ (format "Iteration %d." num)) (setq num (1+ num))) -| Iteration 0. -| Iteration 1. -| Iteration 2. -| Iteration 3. ⇒ nilЧтобы написать цикл повторения до тех пор, пока, который будет выполнять что-то на каждой итерации, а затем выполнять проверку, поместите тело, за которым следует проверка, в
prognв качестве первого аргументаwhile, как показано здесь:(while (progn (forward-line 1) (not (looking-at "^$"))))Это перемещает курсор на одну строку вниз и продолжает перемещаться по строкам, пока не достигнет пустой строки. Это особенно в том, что у
whileнет тела, только проверка (которая также выполняет реальную работу по перемещению курсора).
Макросы dolist и dotimes обеспечивают удобный способ записи двух распространённых типов циклов.
- Макрос: dolist (переменная список [результат]) тело…
-
Этот конструкт выполняет тело один раз для каждого элемента списка, привязывая переменную переменная локально к текущему элементу. Затем он возвращает значение вычисления результат, или
nilесли результат опущен. Например, вот как вы можете использоватьdolistдля определения функцииreverse:(defun reverse (list) (let (value) (dolist (elt list value) (setq value (cons elt value)))))
- Макрос: dotimes (переменная количество [результат]) тело…
-
Этот конструкт выполняет тело один раз для каждого целого числа от 0 (включительно) до количество (исключительно), связывая переменную переменная с целым числом для текущей итерации. Затем он возвращает значение вычисления результат, или
nilесли результат опущен. Использование результат устарело. Вот пример использованияdotimesдля выполнения чего-либо 100 раз:(dotimes (i 100) (insert "I will not obey absurd orders\n"))
Copyright © 1990-1996, 1998-2022 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Iteration.html