GO 특수 연산자
GO 특수 연산자 (go)
go는 Common Lisp의 특수 연산자로, 둘러싼 tagbody 폼의 몸체에서 태그(tag)로 표시된 지점으로 제어를 옮겨요. 전통적인 goto에 해당하는 역할이지만, 대상이 어휘 범위 안의 tagbody로 제한돼요.
문법 (Syntax)
go tag =>
인자와 값 (Arguments and Values)
tag— go 태그(go tag)예요.
설명 (Description)
go는 둘러싼 tagbody 폼의 몸체에서, tag와 eql한 태그로 표시된 지점으로 제어를 옮겨요. 그런 태그가 그 몸체에 없으면, 어휘적으로 포함하는 tagbody 폼들(있을 경우)의 몸체도 차례로 살펴봐요. 여러 태그가 tag와 eql하면, go를 포함하는 가장 안쪽 tagbody 폼에 들어 있는 일치 태그로 제어가 옮겨져요. go 지점에서 어휘적으로 보이는 일치 태그가 없으면 결과는 정의되어 있지 않아요.
go가 시작하는 제어 이동은 Section 5.2 (Transfer of Control to an Exit Point)에 설명된 대로 수행돼요.
예제 (Examples)
(tagbody
(setq val 2)
(go lp)
(incf val 3)
lp (incf val 4)) => NIL
val => 6
아래는 go가 실행되기 전에 tagbody가 정상 종료(normal exit)되기 때문에 오류예요.
(let ((a nil))
(tagbody t (setq a #'(lambda () (go t))))
(funcall a))
아래도 go 폼이 실행되기 전에 tagbody를 지나쳐 버리기 때문에 오류예요.
(funcall (block nil
(tagbody a (return #'(lambda () (go a))))))
영향 (Affected By)
없음.
예외 상황 (Exceptional Situations)
없음.
함께 보기 (See Also)
tagbody
참고 (Notes)
없음.