prog (prog (bindings...) {tag | form}...) Binds the variables like let, then runs the body as a tagbody inside a block: go jumps between the body's tags and (return value) exits the prog with value. Falling off the end returns nil. Run(prog ((n 5) (acc 1)) top (when (<= n 1) (return acc)) (setq acc (* acc n)) (setq n (- n 1)) (go top)) ; => 120