코드 블록(Code Block) 또는 블록은 0개 이상의 표현식 그룹으로, 스코프가 지정된 새로운 바디를 도입합니다. (표현식이 0개인 블록은 빈 블록이며 나중에 채워질 자리표시자로 사용하기에 좋습니다.)
코드 블록은 식별자 뒤에만 나타날 수 있습니다.
스코프(Scope) 는 프로그램에서 식별자(이름)와 값의 연결이 유효하며, 이름이 해당 값을 참조하는 데 사용될 수 있는 부분을 말합니다. 예를 들어 한 코드 블록 내에서 생성한 상수 또는 변수는 해당 코드 블록의 컨텍스트에서만 존재합니다. 즉, 오브젝트의 수명은 해당 오브젝트가 생성된 스코프 내로 제한되며 코드 블록 밖에서는 사용될 수 없습니다.
다음 예시는 플레이어가 가진 코인 수로 구매할 수 있는 최대 화살 개수를 계산하는 방법을 보여줍니다. 상수 MaxArrowsYouCanBuy 는 if 블록 내에서 생성되므로 스코프는 if 블록으로 제한됩니다. 상수 MaxArrowsYouCanBuy 를 출력 스트링에서 사용하면 이름 MaxArrowsYouCanBuy 가 if 표현식 밖의 스코프에 존재하지 않기 때문에 오류가 발생합니다.
CoinsPerQuiver : int = 100
ArrowsPerQuiver : int = 15
var Coins : int = 225
if (MaxQuiversYouCanBuy : int = Floor(Coins / CoinsPerQuiver)):
MaxArrowsYouCanBuy : int = MaxQuiversYouCanBuy * ArrowsPerQuiver
Print("You can buy at most {MaxArrowsYouCanBuy} arrows with your coins.") # 오류: 알 수 없는 식별자 MaxArrowsYouCanBuy
Verse는 식별자가 다른 스코프에서 선언되더라도 식별자의 재사용을 지원하지 않습니다. 재사용하려면 식별자 앞에 (qualifying_scope:) 를 추가하여 식별자를 한정해야 하며, 여기서 qualifying_scope는 식별자의 모듈, 클래스 또는 인터페이스 이름입니다. 식별자를 정의하고 사용할 때마다 식별자에 한정자를 추가해야 합니다.
자세한 내용은 모듈, 클래스, 인터페이스를 참고하세요.
코드 블록 포맷
Verse의 코드 블록에는 3가지 포맷이 있습니다. 이들은 모두 시맨틱 측면에서 동등하므로 역할을 바꾸지 않고도 코드 블록의 스타일을 바꿀 수 있습니다.
코드 블록을 다른 코드 블록 안에 중첩하는 경우, 중첩된 코드 블록의 시작 부분에서 식별자를 계속 사용해야 합니다. 코드를 중첩하려면 블록 표현식을 사용합니다.
공백 삽입 포맷
이 포맷에서 블록은 : 기호로 시작하며 뒤에 오는 각 표현식은 자체적인 줄에 배치됩니다. 각 줄은 4칸의 공백만큼 균일하게 들여쓰기됩니다.
if (test-arg-block):
expression1
expression2
if (test-arg-block) 은 블록의 일부가 아니며, 해당 줄 끝의 : 에서부터 블록이 시작됩니다.
; 기호를 사용하여 한 줄에 있는 여러 표현식을 구분할 수도 있습니다.
중괄호를 사용한 여러 줄 포맷
블록은 {} 기호로 감싸지며, 표현식은 새로운 줄에 배치됩니다.
if (test-arg-block)
{
expression1
expression2
}
; 기호를 사용하여 한 줄에 있는 여러 표현식을 구분할 수도 있습니다.
한 줄 점 포맷
이 포맷에서 블록은 . 기호로 시작되며, 각 표현식은 새로운 줄이 아닌 같은 줄에 배치되어, ; 기호로 구분됩니다.
if (test-arg-block). expression1; expression2
else 가 있는 if 표현식에서 한 줄 점 포맷을 사용하는 경우, else 앞에 하나의 표현식만 가질 수 있습니다. 예를 들면 다음과 같습니다.
if (test-arg-block). expression1 else. expression2