Перейти к основному содержимому

Встроенные последовательности

TDC автоматически создаёт несколько последовательностей — они доступны без объявления в <env>. По конвенции их имена начинаются с символа подчёркивания. Их можно использовать в интерполяции (${{_count}}) и в выражениях if (if="_first").

Часто нужны не сами данные карточки, а её место в наборе: какой это по счёту элемент, первый он или последний, сколько всего элементов. TDC считает всё это сам и кладёт результат в четыре готовых имени.

Список встроенных

ИмяЗначение
_countНомер текущей карточки, начиная с 1
_first"true" на первой карточке, "false" — на остальных
_last"true" на последней карточке, "false" — на остальных
_totalОбщее число карточек (то же, что count), повторяется на каждой строке
Строки, а не булевы значения

_first и _last — это строки "true" и "false", а не булевы значения. Это сделано сознательно: чтобы ${{_last}} подставилось как читаемое слово "false" (удобно для "isLast": ${{_last}} в JSON), а условие if="!_last" всё равно корректно трактовало это как ложь.

Всё сразу

<block>
<line><data>_count=${{_count}} _first=${{_first}} _last=${{_last}} _total=${{_total}} ${{Name}}</data></line>
</block>
./run demo.tdc
_count=1  _first=true  _last=false  _total=5  Александр
_count=2  _first=false  _last=false  _total=5  Дмитрий
_count=3  _first=false  _last=false  _total=5  Максим
_count=4  _first=false  _last=false  _total=5  Иван
_count=5  _first=false  _last=true  _total=5  Сергей

_count идёт 1..5, _total на каждой строке равен 5, _first истинно только на первой карточке, _last — только на последней.

Частые применения

Нумерация${{_count}} из ${{_total}}: ${{Name}}.

JSON без висящей запятой — второй <data if="!_last">, ставит запятую на всех карточках, кроме последней:

<line><data>{"id": ${{_count}}, "name": "${{Name}}"}</data><data if="!_last">,</data></line>
./run demo.tdc
{"id": 1, "name": "Артём"},
{"id": 2, "name": "Кирилл"},
{"id": 3, "name": "Никита"},
{"id": 4, "name": "Егор"}

Заголовок только на первой карточке<line if="_first"><data>=== START ===</data></line>.

Подсветка второй половины — встроенные работают внутри арифметики выражений, поэтому if="_count * 2 > _total" становится истинным, как только номер переваливает за середину.

Внутри строки с each=: _item и _item_id

Строка <line each="List"> повторяется по одному разу на каждый элемент списка, и там доступны ещё два встроенных имени — только там; полный приём см. в Реляционных таблицах:

ИмяЗначение
_itemПозиция внутри этой карточки1, 2, 3, заново на каждой карточке
_item_idЧисло, уникальное на весь прогон, — готовый первичный ключ

Они существуют только в строке с each=; в обычной строке ничего не именуют.

Зарезервированные имена

Не начинайте имена своих последовательностей с _ — это зарезервировано. Перекрыть встроенную не получится: TDC откажется запускаться и скажет, какие имена заняты:

./run bad.tdc
error[TDC033]: sequence name "_count" collides with a builtin
note: Builtins: _count, _first, _last, _total. Pick a different name.

См. также