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