Последовательность
Оценивание форм в порядке их появления — наиболее распространённый способ передачи управления от одной формы к другой. В некоторых контекстах, например, в теле функции, это происходит автоматически. В других случаях необходимо использовать конструкцию управляющей структуры для этого: progn, простейшая управляющая конструкция языка Lisp.
Специальная форма progn выглядит следующим образом:
(progn a b c …)
и она указывает на выполнение форм a, b, c и так далее в указанном порядке. Эти формы называются телом формы progn. Значение последней формы в теле становится значением всей конструкции progn. (progn) возвращает nil.
В ранние дни языка Lisp progn был единственным способом выполнения двух или более форм последовательно и использования значения последней из них. Но программисты обнаружили, что им часто необходимо использовать progn в теле функции, где (в то время) разрешалась только одна форма. Поэтому тело функции было преобразовано в неявную progn: несколько форм разрешались так же, как и в теле фактической progn. Многие другие управляющие структуры также содержат неявную progn. В результате progn используется не так часто, как много лет назад. Сейчас она чаще всего требуется внутри unwind-protect, and, or, или в части then условного оператора if.
- Специальная форма: progn формы…
-
Эта специальная форма оценивает все формы в текстовом порядке, возвращая результат последней формы.
(progn (print "The first form") (print "The second form") (print "The third form")) -| "The first form" -| "The second form" -| "The third form" ⇒ "The third form"
Ещё две конструкции аналогично оценивают серию форм, но возвращают разные значения:
- Специальная форма: prog1 форма1 формы…
-
Эта специальная форма оценивает форма1 и все формы в текстовом порядке, возвращая результат форма1.
(prog1 (print "The first form") (print "The second form") (print "The third form")) -| "The first form" -| "The second form" -| "The third form" ⇒ "The first form"Вот способ удаления первого элемента из списка в переменной
x, а затем возвращения значения этого бывшего элемента:(prog1 (car x) (setq x (cdr x)))
- Специальная форма: prog2 форма1 форма2 формы…
-
Эта специальная форма оценивает форма1, форма2 и все последующие формы в текстовом порядке, возвращая результат форма2.
(prog2 (print "The first form") (print "The second form") (print "The third form")) -| "The first form" -| "The second form" -| "The third form" ⇒ "The second form"
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/Sequencing.html