실패는 Verse의 컨트롤 플로입니다.
프로그램의 플로 변경을 위해 부울 값인 true와 false를 사용하는 타 프로그래밍 언어와 달리 Verse는 성공 또는 실패할 수 있는 표현식을 사용합니다. 이 표현식은 실패 가능 표현식(Failable Expression) 이라고 하며 실패 컨텍스트 에서만 실행될 수 있습니다.
실패를 컨트롤 플로로 사용하면 작업을 복제할 필요가 없으며 미세한 오류를 피할 수 있습니다.
예를 들어 다른 언어에서는 특정 인덱스의 배열 엘리먼트에 액세스하기 전에 그 배열의 해당 인덱스가 유효한지 확인해야 합니다. 이는 타 언어에서 오류의 흔한 원인이 됩니다.
Verse에서는 이를 피하기 위해 유효성 검사와 액세스가 결합되어 있습니다.
예를 들면
if (Element := MyArray[Index]):
Log(Element)
실패 가능 표현식
실패 가능 표현식은 성공하여 값을 생성하거나 실패하여 아무 값도 반환하지 않을 수 있는 표현식입니다. 실패 가능 표현식의 예시로는 배열에 인덱싱하기(유효하지 않은 인덱스는 실패하기 때문), 두 값 비교 등의 연산자 사용하기 등이 있습니다.
작성하는 코드는 기본적으로 실패 가능하지 않습니다. 예를 들어 실패 가능한 함수를 작성하려면 이펙트 지정자 <decides> 를 함수 정의에 추가해야 합니다. 현재는 <decides> 사용 시 <transacts> 도 추가해야 합니다.
실패 가능 표현식의 전체 목록은 Verse의 표현식 목록을 참조하세요.
실패 컨텍스트
실패 컨텍스트는 실패 가능 표현식 실행이 허용되는 컨텍스트입니다. 이 컨텍스트는 표현식이 실패할 경우 어떤 일이 발생할지 정의합니다. 실패 컨텍스트에서 발생한 모든 실패는 전체 컨텍스트를 실패하게 만듭니다.
실패 컨텍스트에서는 함수 실행인자나 block 표현식의 표현식 등 중첩된 표현식이 실패 표현식이 될 수 있습니다.
Verse에서 실패 컨텍스트의 유용한 측면은 실패 컨텍스트가 추측 실행 의 한 양식이라는 것입니다. 따라서 커밋하지 않고도 액션을 시도해 볼 수 있습니다. 표현식이 성공하면 변수 값 변경 등 표현식의 이펙트가 커밋 됩니다. 표현식이 실패하면 마치 표현식이 일어나지 않았던 것처럼 표현식의 이펙트가 롤백 됩니다.
이 방법으로 변경사항이 누적되는 여러 액션을 실행할 수 있지만, 어느 지점에서라도 실패하면 전체 액션이 실행 취소됩니다.
이를 위해 실패 컨텍스트에서 호출되는 모든 함수는 이펙트 지정자 <transacts> 를 가져야 하며, 그러지 않은 경우 컴파일러에서 오류가 발생합니다.
사용자 정의 함수는 기본적으로 transacts 이펙트를 갖지 않습니다. 해당 함수의 정의에 명시적인 <transacts> 지정자를 추가해야 합니다. 일부 네이티브 함수도 transacts 이펙트를 갖지 않으며 실패 컨텍스트에서 호출될 수 없습니다.
transacts 가 없는 네이티브 함수의 예시는 BeginSound() 메서드가 있는 audio_component입니다. 사운드가 시작되면 정지되어도 이를 알 수 있습니다.
다음 목록에는 Verse에서 제공하는 모든 실패 컨텍스트가 정리되어 있습니다.
-
if표현식의 조건입니다.if (test-arg-block) { … } -
for표현식에 대한 반복작업 표현식 및 필터링 표현식입니다.for는 각 반복작업마다 실패 컨텍스트를 생성한다는 점에서 특별합니다. 반복작업이 중첩된 경우 실패 컨텍스트도 중첩됩니다. 표현식이 실패하면 가장 안쪽의 실패 컨텍스트가 중단되며 그 바깥에 반복작업이 있다면 다음 반복작업을 계속합니다.for (Item : Collection, test-arg-block) { … } -
<decides>이펙트 지정자가 있는 함수의 바디 또는 메서드.IsEqual()<decides><transacts> : void = { … } -
not연산자에 대한 피연산자입니다.not expression -
or의 왼쪽 피연산자.expression1 or expression2 -
option타입이 있는 변수의 초기화.option{expression}