Данные и управление

Конвейеры и заполнители

Отследите передачу значения через подстановку первого аргумента, заполнители, вызываемые значения и поля.

Конвейер показывает, как результат одного шага передаётся на следующий. left |> right вычисляет левую часть один раз, сохраняет значение и передаёт его вправо по единому чёткому правилу. Заполнитель _ указывает конкретную позицию аргумента вызова, куда подставляется сохранённое значение.

Самодостаточный конвейер

Сохраните код в pipelines-placeholders.tpz:

TOPAZ
function прибавить(значение: int, величина: int) -> int {
    значение + величина
}

function умножить(слева: int, справа: int) -> int {
    слева * справа
}

function равны(слева: int, справа: int) -> bool {
    слева == справа
}

let результат = 5
    |> прибавить(2)
    |> умножить(_, 3)
let повторяется = результат |> равны(_, _)

print("{результат} {повторяется}")

Проверьте и запустите файл:

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 |> .fieldПрочитать field у value

Конвейеры связываются слева направо. Каждый шаг получает завершённый результат предыдущего. Заполнитель относится к ближайшему содержащему его вызову. Символ _ в шаблоне сопоставления, напротив, означает пропуск значения. Токен одинаков, но область применения и назначение различаются.

В позициях аргументов одного вызова допускается один или несколько заполнителей. Все они получают одно сохранённое левое значение. Если справа присутствует хотя бы один допустимый _, замена имеет приоритет и дополнительная вставка первого аргумента не выполняется.

Частая ошибка

Сам по себе _ не является значением. Его нельзя использовать в качестве всей правой части, вызываемого объекта, имени члена или поля. Поместите его в список аргументов того вызова, который должен получить значение конвейера.

Конструкция value |> ?.field не поддерживается. Используйте обычную опциональную цепочку заранее или явную лямбду. Именованные аргументы и после подстановки должны идти за позиционными и развёрнутыми. Если правая часть не является вызовом, вызываемым значением или .field, проверка сообщает о статической ошибке.

Конвейер не добавляет автоматическую передачу Result, частичное применение или неявную асинхронность. Для Result используйте явный постфиксный ?, а для ограниченной конкурентной работы — явный concurrent.

Приоритет описан в разделе Операторы и выражения, вызываемые значения — в Функции и обобщения, а этапы над коллекциями — в Коллекции и включения.