elisp: Sequencing

 
 10.1 Sequencing
 ===============
 
 Evaluating forms in the order they appear is the most common way control
 passes from one form to another.  In some contexts, such as in a
 function body, this happens automatically.  Elsewhere you must use a
 control structure construct to do this: ‘progn’, the simplest control
 construct of Lisp.
 
    A ‘progn’ special form looks like this:
 
      (progn A B C ...)
 
 and it says to execute the forms A, B, C, and so on, in that order.
 These forms are called the “body” of the ‘progn’ form.  The value of the
 last form in the body becomes the value of the entire ‘progn’.
 ‘(progn)’ returns ‘nil’.
 
    In the early days of Lisp, ‘progn’ was the only way to execute two or
 more forms in succession and use the value of the last of them.  But
 programmers found they often needed to use a ‘progn’ in the body of a
 function, where (at that time) only one form was allowed.  So the body
 of a function was made into an implicit ‘progn’: several forms are
 allowed just as in the body of an actual ‘progn’.  Many other control
 structures likewise contain an implicit ‘progn’.  As a result, ‘progn’
 is not used as much as it was many years ago.  It is needed now most
 often inside an ‘unwind-protect’, ‘and’, ‘or’, or in the THEN-part of an
 ‘if’.
 
  -- Special Form: progn forms...
      This special form evaluates all of the FORMS, in textual order,
      returning the result of the final form.
 
           (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"
 
    Two other constructs likewise evaluate a series of forms but return
 different values:
 
  -- Special Form: prog1 form1 forms...
      This special form evaluates FORM1 and all of the FORMS, in textual
      order, returning the result of FORM1.
 
           (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"
 
      Here is a way to remove the first element from a list in the
      variable ‘x’, then return the value of that former element:
 
           (prog1 (car x) (setq x (cdr x)))
 
  -- Special Form: prog2 form1 form2 forms...
      This special form evaluates FORM1, FORM2, and all of the following
      FORMS, in textual order, returning the result of FORM2.
 
           (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"