데이터와 제어

파이프라인과 플레이스홀더

하나의 값이 첫 인수 삽입, 자리표시자, 호출 가능 값, 필드로 흐르는 방식을 따라갑니다.

앞 작업의 결과가 다음 작업으로 흘러가는 모습을 코드에 드러내고 싶을 때 파이프라인을 사용합니다. left |> right는 왼쪽을 한 번 평가해 저장한 뒤, 정해진 한 가지 규칙으로 그 값을 오른쪽에 전달합니다. _는 저장된 값이 들어갈 호출 인수 자리를 정확히 표시합니다.

외부 이름에 기대지 않는 파이프라인

다음 코드를 pipelines-placeholders.tpz로 저장하세요.

TOPAZ
function add(value: int, amount: int) -> int {
    value + amount
}

function multiply(left: int, right: int) -> int {
    left * right
}

function equal(left: int, right: int) -> bool {
    left == right
}

let result = 5
    |> add(2)
    |> multiply(_, 3)
let repeated = result |> equal(_, _)

print("{result} {repeated}")

검사하고 실행합니다.

BASH
topaz check pipelines-placeholders.tpz
topaz run pipelines-placeholders.tpz

출력은 다음과 같습니다.

출력
21 true

첫 단계에는 _가 없으므로 저장된 5가 첫 번째 인수에 삽입되어 add(5, 2)가 됩니다. 두 번째 단계는 저장된 7이 들어갈 자리를 multiply(7, 3)처럼 지정합니다. 마지막 파이프라인에서는 두 _가 모두 같은 저장값 21을 받으므로 equal(21, 21)과 같습니다. 두 번째 자리표시자 때문에 왼쪽을 다시 평가하지 않습니다.

오른쪽 형태에 따른 네 가지 선택

오른쪽 형태
value |> call(other)value를 모든 명시적 위치·펼침·이름 인수보다 앞에 삽입
value |> call(_, other)유효한 모든 _ 인수를 value로 교체하며 추가 삽입은 하지 않음
value |> callable호출 가능 값에 value 하나를 전달
value |> .fieldvalue에서 field를 읽음

파이프라인은 왼쪽에서 오른쪽으로 결합하므로 각 단계는 바로 앞 단계가 완료한 값을 받습니다. 자리표시자는 자신을 포함하는 가장 가까운 호출에 속합니다. 패턴 안의 _는 값을 버리는 와일드카드이므로, 토큰만 같고 역할과 범위는 다릅니다.

호출 인수 위치에 있다면 _를 하나 이상 쓸 수 있습니다. 모든 자리표시자는 같은 저장값을 받습니다. 자리표시자가 하나라도 있으면 교체 규칙이 우선하므로 첫 번째 인수에 값을 한 번 더 삽입하지 않습니다.

흔한 실수 고치기

_ 하나만으로는 값이 되지 않습니다. 파이프라인 오른쪽 전체, 호출할 함수 이름, 멤버 이름, 필드 이름으로 쓸 수 없습니다. 파이프된 값을 받을 호출의 인수 목록 안에 두세요.

value |> ?.field 같은 선택적 필드 약식은 지원하지 않습니다. 일반 선택적 체이닝을 먼저 사용하거나 명시적 람다 안에서 처리하세요. 이름 인수는 파이프라인 결합 뒤에도 위치 인수와 펼침 인수 뒤에 와야 합니다. 오른쪽이 호출, 호출 가능 값, .field 중 어느 것도 아니면 정적 오류입니다.

파이프라인은 Result를 자동 전파하거나, 부분 적용을 만들거나, 작업을 자동으로 비동기화하지 않습니다. Result 전파에는 후위 ?, 제한된 동시 작업에는 명시적 concurrent를 사용합니다.

우선순위는 연산자와 표현식, 호출 가능 값은 함수와 제네릭, 컬렉션을 만드는 단계는 컬렉션과 컴프리헨션에서 이어집니다.