값이 필요할 때는 표현식을 씁니다. 산술과 비교, 함수 호출이 값을
만듭니다. if와 match도 값을 만들 수 있습니다. 대입은 역할이
다릅니다. 대입은 이미 있는 가변 위치를 바꾸는 문장입니다. 그래서 다른
식 안에 넣을 값을 만들지 않습니다.
결과가 보이는 프로그램부터 시작하기
다음 코드를 operators-expressions.tpz로 저장하세요.
function score(base: int, bonus: int) -> int {
let doubled = base * 2
if bonus > 0 { doubled + bonus } else { doubled }
}
let result = score(20, 2)
let exact = result == 42
let changed = result != 41
print("{result} {exact} {changed}")검사하고 실행합니다.
topaz check operators-expressions.tpz
topaz run operators-expressions.tpz
출력은 다음과 같습니다.
42 true truebase * 2를 + bonus보다 먼저 계산합니다. 선택된 if 가지의 값이 곧
함수 결과입니다. ==는 비교할 수 있는 두 값이 같은지 묻습니다. !=는
두 값이 다른지 묻습니다. 둘 다 바인딩을 바꾸지 않습니다.
하려는 일에 맞는 연산자 고르기
| 필요한 일 | 표기 | 구별할 점 |
|---|---|---|
| 산술 | +, -, *, /, %, ** | 숫자 피연산자는 같은 int 또는 float 영역에 있어야 함 |
| 순서·동등 비교 | <, <=, >, >=, ==, != | 비교 가능한 타입에만 적용 |
| 포함 여부 | value in collection | Map은 값 자체가 아니라 키에서 찾음 |
| 조건부 계산 | left && right, left || right | 필요할 때만 오른쪽을 계산 |
| 값이 없을 때 기본값 | value ?? fallback | nullable 값이나 Option을 합침 |
| Result 전파 | 후위 value? | 둘러싼 함수에서 Err를 반환하며 ??와 다름 |
| 왼쪽에서 오른쪽으로 흐르기 | value |> next | 일반 이항 산술이 아니라 파이프라인 규칙 |
| 변경 | target = value, +=, ??= | 값을 만드는 식이 아니라 문장 |
&&는 왼쪽이 true일 때만 오른쪽을 평가합니다. ||는 왼쪽이
false일 때만 오른쪽을 평가합니다. 앞 조건이 성공해야만 할 수 있는
작업을 지킬 때 이 단락 평가가 쓸모 있습니다. ??도 왼쪽에 값이 있으면
기본값을 건너뜁니다. 후위 ?는 경계가 전혀 다릅니다.
Null·Option·결과·실행 오류에서
둘러싼 함수로 실패를 전파하는 규칙을 확인하세요.
숫자와 동등성의 경계
int는 부호 있는 64비트 정수입니다. 정수 나눗셈은 0 쪽으로 버립니다.
나머지는 나누어지는 수의 부호를 따릅니다. 정수 범위를 넘거나 0으로
나누면 실행 오류입니다. 실행 중에 정해지는 음수 정수 지수도 실행
오류입니다. 같은 잘못을 상수식에서 확인하면 정적 오류가 됩니다.
float는 IEEE-754 binary64를 따릅니다. 부동소수점의 0 나눗셈과 NaN도
그 모델을 따릅니다. int와 float 사이에는 암묵적 변환이 없습니다.
기본 타입 값, 호환되는 레코드, Array, Option, Result, 명목 값은 안에 든 타입이 비교 가능할 때만 비교할 수 있습니다. Array 동등성은 길이와 원소 순서를 봅니다. Map과 Set 값, 함수, 리소스, 템플릿 값은 동등 비교를 할 수 없습니다. 명목 동등성은 필드를 보기 전에 같은 enum, record, newtype 정체성인지 먼저 확인합니다.
우선순위는 호출과 멤버 접근, 거듭제곱, 단항 연산, 곱셈, 덧셈, 범위,
비교, &&, ||, ??, 합성, 마지막으로 |> 순으로 낮아집니다.
전체 표를 외울 필요는 없습니다. 무엇이 무엇과 묶이는지가 설명에
중요하다면 소괄호로 드러내세요.
흔한 실수 고치기
count++, count--, count **= 2는 토파즈 표기가 아닙니다. 가변
바인딩에는 count = count + 1처럼 직접 대입하세요. 동등 비교에
=를 쓰지 마세요. =는 가변 대상을 바꿉니다. ==는 불리언 값을
만듭니다.
비트 연산자, 암묵적 숫자 승격, 부동소수점 나머지 연산자, 연산자
오버로딩, 사용자 정의 연산자는 현재 표면 밖입니다. 함수 합성은 명세에
있습니다. 다만 이 문서의 일반 예제에서는 이름 있는 함수나 |>를
씁니다.
연산자가 받는 값은 타입, 값을 만드는 분기는
패턴과 제어 흐름, |>의 정확한
흐름은 파이프라인과 플레이스홀더에서
이어집니다.