언리얼 Verse: 실패 가능 표현식 — 참·거짓 대신 성공·실패로 갈린다
Verse에는 참·거짓으로 가지를 치지 않는다
대부분의 언어에서 if는 불리언을 본다. 참이면 이쪽, 거짓이면 저쪽이다.
UEFN의 Verse는 이 구조를 쓰지 않는다. 대신 표현식이 성공하거나 실패한다. 실패할 수 있는 표현식을 failable expression이라고 부른다.
왜 이렇게 만들었나
배열 접근을 생각해 보자. 다른 언어에서는 인덱스가 유효한지 먼저 검사하고, 그다음 값을 꺼낸다. 검사와 접근이 두 번 일어난다.
두 단계 사이가 벌어지면 버그가 생긴다. 검사한 인덱스와 실제로 쓴 인덱스가 달라지는 실수가 흔하다.
Verse에서는 배열 접근 자체가 실패할 수 있는 표현식이다. 성공하면 그 자리에서 값을 준다. 검사와 획득이 한 번에 끝난다.
실패 컨텍스트
실패할 수 있는 표현식은 아무 데나 쓸 수 없다. 실패 컨텍스트 안에서만 실행된다.
실패 컨텍스트는 "실패했을 때 무엇을 할지"가 정해진 자리다. if의 괄호 안이 대표적이다. for의 조건부도 실패 컨텍스트다.
규칙은 하나다. 컨텍스트 안에서 하나라도 실패하면 그 컨텍스트 전체가 실패한다.
내 함수를 실패 가능하게 만들기
직접 쓴 함수는 기본적으로 실패하지 않는다. 실패할 수 있게 하려면 이펙트 지정자 <decides>를 붙인다.
현재는 <transacts>도 함께 필요하다. 실패했을 때 부분 변경을 되돌려야 하기 때문이다.
logic 타입 값을 조건으로 쓰려면 ? 질의 연산자를 붙인다. if (Flag?) 형태다. 불리언을 실패 가능 표현식으로 바꾸는 문법이다.
읽기 좋게 쓰는 선
Epic의 스타일 가이드는 한 줄에 조건을 세 개까지로 제한한다. 세 개 미만이면 괄호 형태를 쓴다.
넘어가면 여러 줄 형태로 푼다. 조건이 계속 늘어난다면 <decides> 함수 하나로 묶는 편이 낫다. 이름이 붙으면 의도가 드러나고 재사용도 된다.
공식 문서는 Failure in Verse와 If in Verse에 있다.
쉽게 풀어보기
보통 프로그램은 "맞다/틀리다"로 길을 고른다. 맞으면 왼쪽, 틀리면 오른쪽으로 간다.
Verse는 조금 다르게 생각한다. "해봤는데 됐다/안 됐다"로 길을 고른다.
상자에서 세 번째 물건을 꺼낸다고 해보자. 보통은 먼저 "세 번째가 있나?" 확인하고, 그다음에 꺼낸다. 두 번 일을 하는 셈이다.
Verse에서는 그냥 꺼내 본다. 있으면 손에 들려 있고, 없으면 실패한 것이다. 한 번에 끝난다.
대신 아무 데서나 이렇게 할 수는 없다. 실패했을 때 어디로 갈지 정해진 자리에서만 된다.
내가 만든 기능도 실패할 수 있게 만들려면 표시를 붙여야 한다. 그 표시가 <decides>다.
조건을 너무 많이 붙이면 읽기 힘들어진다. 세 개가 넘으면 따로 이름을 붙여 묶는 게 좋다.
리깅 파이프라인 자동화 도구
반복 작업은 스크립트에게. 현업에서 쓰는 리깅 툴 모음.
리깅 도구 보기