% 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))))))
なし。
なし。
なし。