Spec-Zone.ru › Elisp

Итерация

Итерация означает многократное выполнение части программы. Например, вы можете захотеть повторить вычисление один раз для каждого элемента списка или один раз для каждого целого числа от 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API