% Special-Operator GO
Special Operator GO
go
tag =>|
tag - go
のタグ
go
は、tagbody
フォームによって囲まれたボディ部にある
tagとeql
で一致するタグによってラベル付けされている場所に
制御を移します。
もしボディ部にそのようなtagが存在しないときは、
レキシカルに含まれるtagbody
フォームがもしあるなら、
同じように検査されます。
いくつかのタグがtagとeql
で一致するときは、
go
が含まれる場所から、
一致するtagを含んだもっとも内側のtagbody
フォームの
いずれかに制御が移されます。
go
の場所からレキシカルに見ることができるtagが
存在しないときの結果は未定義です。
go
によって開始される制御の遷移の実行についての説明は、
5.2. 終了地点への制御の遷移をご確認ください。
(tagbody
(setq val 2)
(go lp)
(incf val 3)
lp (incf val 4)) => NIL
val => 6
下記の例は、go
が実行される前に
tagbody
が通常の終了を行っているためエラーです。
(let ((a nil))
(tagbody t (setq a #'(lambda () (go t))))
(funcall a))
下記の例は、go
が実行される前に
tagbody
が上を通過しているためエラーです。
(funcall (block nil
(tagbody a (return #'(lambda () (go a))))))
なし。
なし。
なし。