The 'prog*' special form is basically a 'block' construct that contains symbols with optional initializations and a block of code [expressions] to evaluate. The 'prog*' special form evaluates its initializations in sequential order as opposed to prog which does it in no specified order. The first form after the 'prog*' is the 'binding' form. It contains a series of 'symbols' or 'bindings'. The 'binding' is a 'symbol' followed by an initialization expression 'init-expr'. If there is no 'init-expr', the 'symbol' will be initialized to NIL. The order of execution of the bindings is sequential. If a return form is evaluated, its value will be returned. Otherwise, NIL is returned. When the 'prog*' is finished execution, the 'symbols' that were defined will no longer exist or retain their values.
(prog* (i j)                 ; PROG* with vars I and J
       (print i) (print j))  ; prints  NIL NIL  returns NIL
(prog* ((i 1) (j 2))         ; PROG* with vars I and J
       (print i) (print j)
       (return (+ i j)))     ; prints 1 2  returns 3
(prog* () (print "hello"))   ; prints "hello"  returns NIL
(prog ((i 1) (j (+ i 1)))    ; PROG won't work due to order
      (print (+ i j)) )      ; error: unbound variable - I
(prog* ((i 1) (j (+ i 1)))   ; PROG* will work due to order
       (print (+ i j)) )     ; prints 3  returns NIL
See the
prog*
special form in the