prog1, prog2
prog1 first-form {form}* → result-1
prog2 first-form second-form {form}* → result-2
first-form—a form; evaluated as described below.
second-form—a form; evaluated as described below.
forms—an implicit progn; evaluated as described below.
7.4.0 8result-1—the primary value resulting from the evaluation of first-form.
7.4.0 11result-2—the primary value resulting from the evaluation of second-form.
7.4.0 6prog1 evaluates first-form and then forms, yielding as its only value the primary value yielded by first-form.
7.4.0 9prog2 evaluates first-form, then second-form, and then forms, yielding as its only value the primary value yielded by first-form.
I hope this is implied by the above. -kmp 22-Oct-91 The arguments are evaluated in the order in which they are given.
(setq temp 1) → 1
(prog1 temp (print temp) (incf temp) (print temp))
⊳ 1
⊳ 2
→ 1
(prog1 temp (setq temp nil)) → 2
temp → NIL
(prog1 (values 1 2 3) 4) → 1
(setq temp (list 'a 'b 'c))
(prog1 (car temp) (setf (car temp) 'alpha)) → A
temp → (ALPHA B C)
(flet ((swap-symbol-values (x y)
(setf (symbol-value x)
(prog1 (symbol-value y)
(setf (symbol-value y) (symbol-value x))))))
(let ((*foo* 1) (*bar* 2))
(declare (special *foo* *bar*))
(swap-symbol-values '*foo* '*bar*)
(values *foo* *bar*)))
→ 2, 1
(setq temp 1) → 1
(prog2 (incf temp) (incf temp) (incf temp)) → 3
temp → 4
(prog2 1 (values 2 3 4) 5) → 2
None.
None.
None.
7.4.0 7prog1 and prog2 are typically used to evaluate one or more forms with side effects and return a value that must be computed before some or all of the side effects happen.
The second example is wrong because it passes top-level-ness to form1, which is forbidden by issue MACRO-SUBFORMS-TOP-LEVEL-P. --sjl 5 Mar 92 \code (prog1 \starparam{form}) \EQ (values (multiple-value-prog1 \starparam{form})) (prog2 \param{form1} \starparam{form}) \EQ (progn \param{form1} (prog1 \starparam{form})) \endcode
(prog1 {form}*) ≡ (values (multiple-value-prog1 {form}*))
(prog2 form1 {form}*) ≡ (let () form1 (prog1 {form}*))