Соедините вызовы функций оператором |> и проследите, как каждый результат становится следующим входом. Заполнитель _ позволяет выбрать аргумент, который получит этот вход.
Установите Топаз по уроку Первая программа. Объявления и вызовы функций описаны в уроке Значения и функции.
Передайте значение через три вызова
Сохраните код в файле pipelines-placeholders.tpz в своей рабочей папке.
function прибавить(значение: int, величина: int) -> int {
значение + величина
}
function умножить(слева: int, справа: int) -> int {
слева * справа
}
function равны(слева: int, справа: int) -> bool {
слева == справа
}
let результат = 5
|> прибавить(2)
|> умножить(_, 3)
let повторяется = результат |> равны(_, _)
print("{результат} {повторяется}")В этой же папке проверьте файл и запустите его.
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. Конвейер автоматически не передаёт ошибки, не создаёт функцию с частью заданных аргументов и не запускает асинхронную работу. Пользовательские операторы конвейера не поддерживаются.
Приоритет описан в разделе Операторы и выражения, а значения функций в разделе Функции и обобщения. Шаги, создающие коллекции, описаны в разделе Коллекции и включения.