ToC DocOverview CGDoc RelNotes Index PermutedIndex
Allegro CL
Home Previous Up Next Table of Contents Index
  ANSI Common Lisp   5 Data and Control Flow   5.3 Dictionary of Data and Control Flow

5.3.58 prog1, prog2 Macro

Syntax:
prog1 first-form {form}*    result-1

prog2 first-form second-form {form}*    result-2

Arguments and Values:
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.

Description:
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.

Examples:
 (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

See Also:
multiple-value-prog1, progn

Notes:
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}*))

Allegro CL Implementation Details:
The ANS contains this obvious typo: where is says of prog2 above: 'prog2 evaluates first-form, then second-form, and then forms, yielding as its only value the primary value yielded by first-form', it should say 'yielding as its only value the primary value yielded by second-form' and that is what Allegro CL implements.

Home Previous Up Next Table of Contents Index
© Franz Inc. All Rights Reserved - File last updated 2022-07-25