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

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

Передавайте результаты между вызовами и выбирайте позиции аргументов с помощью заполнителя _.

Соедините вызовы функций оператором |> и проследите, как каждый результат становится следующим входом. Заполнитель _ позволяет выбрать аргумент, который получит этот вход.

Установите Топаз по уроку Первая программа. Объявления и вызовы функций описаны в уроке Значения и функции.

Передайте значение через три вызова

Сохраните код в файле 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

Проверка завершается с кодом 0. Программа печатает следующий результат.

Вывод
21 true

Проследите результат

ШагВызов после передачи значенияРезультат
5 |> прибавить(2)прибавить(5, 2)7
7 |> умножить(_, 3)умножить(7, 3)21
21 |> равны(_, _)равны(21, 21)true

Конвейеры выполняются слева направо. Каждый шаг вычисляет левую часть один раз, прежде чем вычислять правую. Оба заполнителя в равны(_, _) получают одно сохранённое значение.

Выберите позицию входного значения

Правая частьДействие Топаза
value |> call(other)Вставляет value первым аргументом
value |> call(_, other)Заменяет каждый допустимый _ на value
value |> callableВызывает значение функции с аргументом value
value |> .fieldЧитает field из value

Без заполнителя вход вставляется перед позиционными, развёрнутыми и именованными аргументами. При наличии заполнителей Топаз заменяет их и не добавляет ещё один первый аргумент.

Заполнитель относится к ближайшему содержащему его вызову. Несколько заполнителей могут получить сохранённый вход. В шаблоне _ принимает значение без привязки имени.

Исправьте позицию аргумента

Если в pipelines-placeholders.tpz убрать _ из умножить(_, 3), останется умножить(3). Конвейер вставит предыдущий результат первым аргументом и по-прежнему получит 21. Если написать там умножить(7, 3), после вставки получится три аргумента и проверка завершится ошибкой.

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

Именованные аргументы должны идти после позиционных и развёрнутых. Правая часть должна быть вызовом, значением функции или .field, иначе возникает статическая ошибка.

Для необязательного поля используйте обычную опциональную цепочку до конвейера или внутри лямбды. Форма value |> ?.field не поддерживается.

Обрабатывайте ошибки и конкурентные задачи явно

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

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