The do (or doing) construct evaluates all forms in its clause.
The return construct takes one form. Any values returned by the form are immediately returned by the loop form. It is equivalent to the clause do (return-from block-name value), where block-name is the name specified in a named clause, or nil if there is no named clause.
For more information, see Section 6.1.5 (Unconditional Execution Clauses).