Topazdocs
언어 정책

Defer와 리소스

`defer`와 `using`이 정상 종료·조기 반환·실패에서 자원을 정리하는 방식.

자원 정리는 실행 경로가 여러 개일 때도 누락되지 않아야 합니다. defer는 현재 어휘 범위가 끝날 때 실행할 작업을 등록합니다.

정책

defer { ... }는 등록된 범위가 정상적으로 끝나거나 return, break, continue, ?로 빠져나갈 때 실행됩니다. 한 범위에서 여러 개를 등록하면 마지막에 등록한 것부터 역순으로 실행됩니다. using file = File.open(...) { ... }는 파일 자원을 열고 블록이 끝나면 닫는 약식입니다.

명시된 동작

defer의 본문은 실제로 정리가 실행될 때 평가됩니다. 정리 중 실행 오류가 나면 이후 정리를 계속할지는 호스트 규칙에 따릅니다. 기존의 Err를 정리 오류로 자동 교체하지 않습니다. using의 파일 이름은 블록 안에서만 사용할 수 있고 외부로 옮길 수 없습니다.

제약과 명시적 거부

defer는 최상위에 쓸 수 없고, 본문에서 return, break, continue로 정리 흐름을 어지럽힐 수 없습니다. using은 현재 정해진 File 형식에만 적용됩니다. 닫힌 후의 파일 작업에 대한 호환 가능한 동작은 정의되지 않습니다.

유예 경계

사용자 정의 자원 정리 프로토콜, 여러 자원의 동시 획득, 자원 소유권 이전, 비동기 정리, 취소, 모듈 수명 정리는 현재 범위 밖입니다.

예제

TOPAZ
function writeLog(message: string) -> Result<(), string> {
    let file = open("app.log")?
    defer { file.close() }

    file.write(message)?
    return Ok(())
}

관련 정책