Special-Operator RETURN-FROM

UP


Special-Operator RETURN-FROM

Special Operator RETURN-FROM

構文

return-from name [result] =>|

引数と戻り値

name - blockタグ、評価はされません。
result - フォーム、評価されます。デフォルトはnilです。

定義

レキシカルに囲まれたblockから制御と多値を返却します。

nameという名前のblockフォームは、 return-fromの出現場所をレキシカルに囲む必要があります。 resultの評価によって得られたどんな多値でも、 blockによってレキシカルに囲まれたもっとも内側のものから 直ちに返却されます。

return-fromによって開始される制御の遷移の実行についての説明は、 5.2. 終了地点への制御の遷移をご確認ください。

例文

(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

下記の例は、return-fromが適用される前に blockフォームが通常の終了を行っているため結果は未定義です。

(funcall (block nil #'(lambda () (return-from nil)))) ;;はエラー

影響

なし。

例外

なし。

参考

block, return, 3.1. 評価

備考

なし。


TOP, Github