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

Конструкции

Генератор производит значение. Конструкция решает, что происходит вокруг этого значения: какое из них берётся, появится ли оно вообще, сколько их ляжет в ячейку, можно ли ему повторяться и во сколько строк развернётся одна карточка.

Это весь список. Шесть конструкций — всё остальное в TDC либо генератор, либо место, куда кладут текст, либо способ посчитать новое из уже полученного.

КонструкцияНа какой вопрос отвечает
<mix>Какая из нескольких веток — в точных долях?Выбор между значениями
<switch>Какое значение следует из другого поля?Таблицы соответствия
ifПоявится ли этот кусок вообще?Условия
repeatСколько значений ляжет в одну ячейку?Несколько значений в ячейке
eachВо сколько строк развернётся одна карточка?Строка на элемент
uniq · <distinct>Можно ли значению повторяться — в строке или вообще?Уникальность

Ещё три вещи ведут себя как конструкции, но описаны в другом месте, потому что принадлежат более крупной теме:

  • <pool> — строка ссылается на целую запись, а не на значение: тридцать врачей, и строка пациента получает одного из них целиком. Тема выросла в отдельный раздел.

  • parent — значение, взятое из подмножества, которое выбрал родитель. Это часть того, как связаны последовательности, поэтому живёт в Последовательностях, а прикладная сторона — в Иерархических зависимостях.

  • <compute> — получение значения вычислением, а не розыгрышем. Это отдельный маленький язык, у него свой раздел.

Четыре из них в одном конфиге

Здесь нет ничего надуманного — так конфиг и выглядит, когда работу делают конструкции. Тариф в заданных долях, цена, следующая из тарифа, переменное число меток в одной ячейке и слово, появляющееся только у платных строк:

<env count="6" seed="tour">
<mix name="Plan" percent="50,30,20">
<case><gen type="text" value="free"/></case>
<case><gen type="text" value="pro"/></case>
<case><gen type="text" value="team"/></case>
</mix>

<switch name="Price" on="Plan">
<map>free:0, pro:12, team:40</map>
</switch>

<sequence name="Tags">
<gen type="text" value="api,web,cli,db" repeat="1..3" separator=";"/>
</sequence>

<sequence name="Id"><gen type="increment" value="1"/></sequence>
</env>

<block>
<line>
<data>${{Id}} ${{Plan}} $${{Price}} [${{Tags}}]</data>
<data if="Price > 0"> paid</data>
</line>
</block>
./run tour.tdc
1 free $0 [web;api]
2 free $0 [api;db;cli]
3 pro $12 [web] paid
4 free $0 [cli]
5 pro $12 [cli;api;db] paid
6 team $40 [db;web] paid

Сверьте вывод с конфигом — каждая конструкция видна: три free из шести это те самые 50 в percent; $12 никогда не оказывается рядом с free, потому что Price не разыгрывается сам, а следует из Plan; число меток меняется от строки к строке; а paid отсутствует ровно там, где цена ноль.

Куда дальше

Страницы этого раздела разбирают по одной конструкции, целиком. Если вы учите язык, читайте подряд — они опираются одна на другую, и примеры постепенно перестают быть игрушечными.

Когда конструкция стала привычной, Руководства покажут, что из них собирать: связные карточки, вывод в CSV и SQL, статистические формы, выбросы, пропуски и наборы, не влезающие в память.