% Special-Operator BLOCK
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. 評価
なし。