검사를 통과한 프로그램도 실행하면서 값과 출력, 실패 결과를 만듭니다. 사용자가 직접 볼 수 있는 출력문, 계산된 값, 컬렉션 순서, 명확한 실행 오류부터 살펴봅니다.
정상 값 관찰하기
다음 코드를 runtime-behavior.tpz로 저장합니다.
let values = [10, 20]
print("int: {7 / 2} {-7 % 3}")
print("float: {1.5 + 1.5}")
print("safe: {values.get(9)}")topaz run runtime-behavior.tpz로 실행하면 다음과 같이 출력됩니다.
int: 3 -1
float: 3.0
safe: Noneprint는 string만 받습니다. 호출 전에 문자열 보간이 정수,
부동소수점 수, Option 값을 표시 가능한 문자열로 바꿉니다. Prelude에
별도의 공개 println 도움 함수는 없으므로 여기 나온 정확한 print
표면을 사용합니다.
int는 부호 있는 64비트 정수입니다. 정수 나눗셈은 0 방향으로
잘라내고 나머지는 피제수의 부호를 따릅니다. 실행 중 정수 범위 초과와
0으로 나누기는 자동으로 감싸지 않고 실행 오류를 냅니다. float는
IEEE-754 binary64이므로 10진 실수 연산이 아니라 부동소수점 규칙을
따릅니다.
values.get(9)는 값이 없는 경우가 정상인 안전한 조회 API이므로
None을 반환합니다.
계약 위반 관찰하기
이 동작을 직접 인덱싱과 비교해 봅니다.
let tasks = ["Run first program", "Build application"]
print(tasks[2])topaz run intentional-fault.tpz는 0이 아닌 코드로 종료하며 문제의
소스 위치를 보여 줍니다.
error[TPZ4001]: index 2 is out of bounds for an array of length 2
--> intentional-fault.tpz:2:7
|
2 | print(tasks[2])
| ^^^^^^^^
실행 오류는 None, Err, 그 밖의 값이 아닙니다. 평가를 중단하며
접미 ?, 선택 연산자, concurrent로 잡을 수 없습니다. 항상 잘못된
상수 산술은 실행 전에 검사 단계에서 거부될 수 있고, 실행 오류는
잘못된 조건에 실행 중 도달했을 때 발생합니다.
관찰 가능한 실패 형식 선택하기
| 상황 | 사용할 형식 또는 예상 결과 |
|---|---|
| 값이 없는 것이 정상임 | get이 None을 반환하는 것과 같은 Option |
| 호출자가 실패 이유에 대응할 수 있음 | Ok 또는 Err를 담은 Result |
| 실행 코드가 런타임 계약을 위반함 | 실행 오류와 0이 아닌 프로세스 종료 |
| 실행 전에 소스가 잘못됨 | topaz check의 정적 진단 |
직접 배열 접근, 실행 중 정수 나눗셈·나머지 연산의 0 제수, 정수 범위
초과, 실행 중 결정되는 0 간격 범위, 음수 정수 지수, 실행 중 빠지는
match는 명시된 실행 오류 원인입니다. 값 없음이 작업의 일부라면
안전한 라이브러리 연산을 우선하세요.
안정적으로 유지되는 것
문자열 비교는 암묵적인 정규화 없이 정확한 유니코드 스칼라 순서를 사용합니다. 배열은 원소 순서를 보존합니다. Map 키 스냅샷은 키를 삽입한 순서를 따르고, 컬렉션 연산은 각 계약에 명시된 순서를 지킵니다. 명목 값은 정본 표시 방식이 요구할 때 생성자 정체성을 유지합니다.
구현마다 내부 표현은 달라도 되지만, 사용자에게 보이는 결과는 같아야 하고 그렇지 못한 대상은 프로그램을 명확히 거부해야 합니다. 이 규칙이 백엔드 내부 도움 함수를 공개 토파즈 API로 만들지는 않습니다.
의도적으로 정하지 않은 것
호스트 정수의 자동 감싸기, 호스트 해시 순서, 로케일 의존 숫자 형식, 암묵적 유니코드 정규화, 잡을 수 있는 실행 오류, 중단 뒤의 자원 정리, 주변 파일 시스템·네트워크 권한, 성능 보장을 추측해서는 안 됩니다. 동시 작업 순서와 출력이 섞이는 순서도 의도적으로 정하지 않았습니다.
값 수준의 선택은 Null·Option·결과·실행 오류에서, 시간 초과와 순서 경계는 동시성에서, 정확한 일상 도움 함수는 코어 라이브러리에서 이어 보세요.