% 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)))) ;;はエラー
なし。
なし。
なし。