prog
1 => first-form {form}{*}
{result-1}
prog
2 => 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.
result-1---the primary value resulting from the evaluation of first-form.
result-2---the primary value resulting from the evaluation of second-form.
prog1 evaluates first-form and then forms, yielding as its only value the primary value yielded by first-form.
prog2 evaluates first-form, then second-form, and then forms, yielding as its only value the primary value yielded by first-form.
(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
section multiple-value-prog1 [Special Operator] , section progn [Special Operator]
prog1 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.
(prog1 {form}{*}) == (values (multiple-value-prog1 {form}{*})) (prog2 form1 {form}{*}) == (let () form1 (prog1 {form}{*}))
Go to the first, previous, next, last section, table of contents.