Special Operator BLOCK
block name form* => result*
name - シンボル
form - フォーム
result - もし通常の返却の場合はフォームの値が返却値が、 明示的な返却(return-fromによるもの)の場合はその値が渡されます。
blockは、nameというblockが確立され、 そのあと暗黙のprognとしてformが評価されます。
特殊オペレーターのblockとreturn-fromは一緒に動作し、 構造的で、レキシカルで、非局所的な退出機能を提供します。
レキシカルに囲まれたformの任意の場所で、 return-fromの引数にnameを与えることで blockのフォームから制御と値を返却することができます。 ただし、同じ名前のblockがはさまって確立しているときは、 外側のblockは内側のものに隠蔽されます。
blockの名前は、レキシカルスコープと動的エクステントを持ちます。
いったん確立すれば、blockは通常の返却か、明示的な返却の どちらかひとつで終了するでしょう。
(block empty) => NIL
(block whocares (values 1 2) (values 3 4)) => 3, 4
(let ((x 1))
(block stop (setq x 2) (return-from stop) (setq x 3))
x) => 2
(block early (return-from early (values 1 2)) (values 3 4)) => 1, 2
(block outer (block inner (return-from outer 1)) 2) => 1
(block twin (block twin (return-from twin 1)) 2) => 2
;; Contrast behavior of this example with corresponding example of CATCH.
(block b
(flet ((b1 () (return-from b 1)))
(block b (b1) (print 'unreachable))
2)) => 1なし。
なし。
return, return-from, 3.1. 評価
なし。