ER-PROGN

perform a sequence of state-changing ``error triples''
Major Section:  ACL2-BUILT-INS

Example:
(er-progn (check-good-foo-p (f-get-global 'my-foo state) state)
          (value (* (f-get-global 'my-foo state)
                    (f-get-global 'bar state))))

This sequencing primitive is only useful when programming with state, something that very few users will probably want to do. See state.

Er-progn is used much the way that progn is used in Common Lisp, except that it expects each form within it to evaluate to an ``error triple'' of the form (mv erp val state). The first such form, if any, that evaluates to such a triple where erp is not nil yields the error triple returned by the er-progn. If there is no such form, then the last form returns the value of the er-progn form.

General Form:
(er-progn <expr1> ... <exprk>)
where each <expri> is an expression that evaluates to an error triple (see programming-with-state). The above form is essentially equivalent to the following (``essentially'' because in fact, care is taken to avoid variable capture).
(mv-let (erp val state)
        <expr1>
        (cond (erp (mv erp val state))
              (t (mv-let (erp val state)
                         <expr2>
                         (cond (erp (mv erp val state))
                               (t ...
                                      (mv-let (erp val state)
                                              <expr{k-1}>
                                              (cond (erp (mv erp val state))
                                                    (t <exprk>)))))))))