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