#### 5.3.25 return-from [Special Operator] ¶

`return-from` name [result] ⇒ #<NoValue>

#### Arguments and Values:: ¶

name—a block tag; not evaluated.

result—a form; evaluated. The default is nil.

#### Description:: ¶

Returns control and multiple values_2 from a lexically enclosing block.

A block form named name must lexically enclose the occurrence of return-from; any values yielded by the evaluation of result are immediately returned from the innermost such lexically enclosing block.

The transfer of control initiated by return-from is performed as described in Transfer of Control to an Exit Point.

#### Examples:: ¶

     (block alpha (return-from alpha) 1) ⇒  NIL
     (block alpha (return-from alpha 1) 2) ⇒  1
     (block alpha (return-from alpha (values 1 2)) 3) ⇒  1, 2
     (let ((a 0))
        (dotimes (i 10) (incf a) (when (oddp i) (return)))
        a) ⇒  2
     (defun temp (x)
        (if x (return-from temp 'dummy))
        44) ⇒  TEMP
     (temp nil) ⇒  44
     (temp t) ⇒  DUMMY
     (block out
       (flet ((exit (n) (return-from out n)))
         (block out (exit 1)))
       2) ⇒  1
     (block nil
       (unwind-protect (return-from nil 1)
         (return-from nil 2)))
    ⇒  2
     (dolist (flag '(nil t))
       (block nil
         (let ((x 5))
           (declare (special x))
           (unwind-protect (return-from nil)
             (print x))))
       (print 'here))
     |>  5
     |>  HERE
     |>  5
     |>  HERE
    ⇒  NIL
     (dolist (flag '(nil t))
       (block nil
         (let ((x 5))
           (declare (special x))
           (unwind-protect
               (if flag (return-from nil))
             (print x))))
       (print 'here))
     |>  5
     |>  HERE
     |>  5
     |>  HERE
    ⇒  NIL

The following has undefined consequences because the block form exits normally before the return-from form is attempted.

     (funcall (block nil #'(lambda () (return-from nil)))) is an error.

#### See Also:: ¶

block [Special Operator] , return [Macro] , Evaluation