언어 기초

연산자와 표현식

산술, 비교, 단락 평가, 대입이 어떤 값을 만들거나 바꾸는지 따라갑니다.

값이 필요할 때 표현식을 사용합니다. 산술, 비교, 함수 호출뿐 아니라 ifmatch도 값을 만들 수 있습니다. 대입의 역할은 다릅니다. 이미 존재하는 가변 위치를 바꾸는 문장이며, 다른 식 안에 넣을 수 있는 값을 만들지 않습니다.

결과가 보이는 프로그램부터 시작하기

다음 코드를 operators-expressions.tpz로 저장하세요.

TOPAZ
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}")

검사하고 실행합니다.

BASH
topaz check operators-expressions.tpz
topaz run operators-expressions.tpz

출력은 다음과 같습니다.

출력
42 true true

base * 2+ bonus보다 먼저 계산되고, 선택된 if 가지의 값이 함수 결과가 됩니다. ==는 비교할 수 있는 두 값이 같은지 묻고, !=는 서로 다른지 묻습니다. 둘 다 바인딩을 변경하지 않습니다.

하려는 일에 맞는 연산자 고르기

필요한 일표기구별할 점
산술+, -, *, /, %, **숫자 피연산자는 같은 int 또는 float 영역에 있어야 함
순서·동등 비교<, <=, >, >=, ==, !=비교 가능한 타입에만 적용
포함 여부value in collectionMap은 값 자체가 아니라 키에서 찾음
조건부 계산left && right, left || right필요할 때만 오른쪽을 계산
값이 없을 때 기본값value ?? fallbacknullable 값이나 Option을 합침
Result 전파후위 value?둘러싼 함수에서 Err를 반환하며 ??와 다름
왼쪽에서 오른쪽으로 흐르기value |> next일반 이항 산술이 아니라 파이프라인 규칙
변경target = value, +=, ??=값을 만드는 식이 아니라 문장

&&는 왼쪽이 true일 때만 오른쪽을 평가하고, ||는 왼쪽이 false일 때만 오른쪽을 평가합니다. 앞 조건이 성공한 뒤에만 가능한 작업을 보호할 때 이 단락 평가가 유용합니다. ??도 왼쪽에 값이 있으면 기본값을 건너뜁니다. 후위 ?는 전혀 다른 경계를 가집니다. Null·Option·결과·실행 오류에서 둘러싼 함수로 실패를 전파하는 규칙을 확인하세요.

숫자와 동등성의 경계

int는 부호 있는 64비트 정수입니다. 정수 나눗셈은 0 쪽으로 버리고, 나머지는 피제수의 부호를 따릅니다. 정수 범위 초과, 0으로 나누기, 실행 중 결정된 음수 정수 지수는 실행 오류입니다. 상수식에서 같은 잘못이 확인되면 정적 오류가 됩니다. float는 IEEE-754 binary64를 따르며, 부동소수점의 0 나눗셈과 NaN도 그 모델을 따릅니다. intfloat 사이에는 암묵적 변환이 없습니다.

기본값, 호환되는 레코드, Array, Option, Result, 명목 값은 내부 타입이 비교 가능할 때만 비교할 수 있습니다. Array 동등성은 길이와 원소 순서를 봅니다. Map과 Set 값, 함수, 리소스, 템플릿 값은 동등 비교할 수 없습니다. 명목 동등성은 필드를 보기 전에 같은 enum, record, newtype 정체성인지 확인합니다.

우선순위는 호출과 멤버 접근, 거듭제곱, 단항 연산, 곱셈, 덧셈, 범위, 비교, &&, ||, ??, 합성, 마지막으로 |> 순으로 낮아집니다. 전체 표를 외울 필요는 없습니다. 묶이는 방식이 설명의 일부라면 소괄호로 드러내세요.

흔한 실수 고치기

count++, count--, count **= 2는 토파즈 표기가 아닙니다. 가변 바인딩에는 count = count + 1처럼 명시적으로 대입하세요. 동등 비교에 =를 쓰지 마세요. =는 가변 대상을 바꾸고, ==는 불리언 값을 만듭니다.

비트 연산자, 암묵적 숫자 승격, 부동소수점 나머지 연산자, 연산자 오버로딩, 사용자 정의 연산자는 현재 표면 밖입니다. 함수 합성은 명세 수준에는 있지만 이 문서의 일반 예제에서는 이름 있는 함수나 |>를 사용합니다.

연산자가 받는 값은 타입, 값을 만드는 분기는 패턴과 제어 흐름, |>의 정확한 흐름은 파이프라인과 플레이스홀더에서 이어집니다.