Spec-Zone.ru › Elisp

Последовательность

Оценивание форм в порядке их появления — наиболее распространённый способ передачи управления от одной формы к другой. В некоторых контекстах, например, в теле функции, это происходит автоматически. В других случаях необходимо использовать конструкцию управляющей структуры для этого: 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

Spec-Zone.ru

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