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))
(=> 2
x) 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. 評価
なし。