The Libretto Programming Language

Libretto для веб-приложений

01 Начало работы
02 Как изучать примеры
03 Имена в Libretto
04 Типы данных
05 Операторы
06 Пути
07 Методы
08 Статическая утиная типизация

06 Пути

Оператор точки

Оператор точки c.exp вычисляет выражение exp в контексте значений c.

В этом примере контекст 1 подается методу add1.

Если в контексте находится более одного значения, то оператор точки превращается в итератор, который последовательно "подает" значение за значением в качестве контекста:

Если в контексте находится пустая последовательность, то выражение после точки ни разу не выполняется:

Здесь выражение после точки содержит ошибку – деление на ноль. Однако поскольку контекст пустой, то до ошибки дело не доходит и вычисление останавливается на x.

Путь

Цепочка применений оператора точки называется путем, например,

В пути реализуется "конвейерная" схема вычислений: результат вычисления предыдущего шага становится контекстом для следующего.

Символ $

Для доступа к контексту внутри пути используется символ доллара $:

На каждом шаге у $ свое значение:

Здесь первый $ равен 10, а второй – 15.

Оператор as

Оператор as присваивает переменной текущее значение шага. Эта переменная действует до конца пути:

Используя as можно увидеть, в каком порядке путь перебирает элементы последовательностей:

Видно, что в пути осуществляется перебор "в глубину".

Оператор index

Оператор index присваивает переменной индекс текущего элемента последовательности шага:

Нумерация элементов начинается от 0.

В следующем примере делается выборка четных элементов последовательности.

Оператор index локален: для каждого контекстного значения шага нумерация начинается заново:

Пустая последовательность

Пустая последовательность играет важную роль для вычислений в пути. Если некоторый шаг принимает значение (), то вычисление дальше не идет:

В данном примере шаг even становится пустым для нечетных чисел в контексте. Поэтому для них вычисление квадрата не делается.

Часто удобно интерпретировать пустоту на некотором шаге как неудачу (failure) в вычислениях для данного значения контекста. Пустоту шагов можно обрабатывать. Для этого существует специальная "ловушка пустоты" ?(..).

Вспомогательный блок

Для блока в пути есть две возможности:

В первом случае блок меняет контекстное значение, во втором – не влияет на него:

В этом примере: для res1 блок {$ + 2} является отдельным шагом, его значение является значением всего пути. Для res2 блок является дополнением к 5 (между ними нет точки). Здесь блок не влияет на значение всего выражения. Блок второго вида называется вспомогательным.

Мы рекомендуем активно пользоваться вспомогательными блоками. Например, они позволяют вставлять отладочный код без боязни испортить результат вычислений:

Здесь блок никак не влияет на результат вычисления.

В качестве еще одного примера использования вспомогательных блоков реализуем глобальный счетчик. Счетчик организуем в базе данных, работающей в оперативной памяти (управление этой базой реализовано в библиотеке libretto/mem). Для работы со счетчиком введем структуру Counter "оборачивающую" мэп базы данных. Метод get возвращает текущее значение счетчика, хранящегося в мэпе. Если значение счетчика отсутствует, то он инициализируется. Метод add увеличивает значение счетчика на 1.

Предположим, что нам нужен метод, возвращающий удвоенное значение счетчика, и при этом увеличивающий его:

Определены два метода, решающие эту задачу – oper1 и oper2. Первый метод реализован в стандартном стиле, а второй использует вспомогательный блок. Разница видна невооруженному глазу.

Такой же блок используется при инициализации счетчика в методе getcount. Инструменты для работы с базами данных и ловушка пустоты .?(...) описаны ниже.

05 Операторы /// 07 Методы