Приложение B: Ключевые слова
Каждое зарезервированное ключевое слово в ArchLang, разделённое по тому, где оно распознаётся.
Ключевые слова в файлах .arch
Заголовок раздела «Ключевые слова в файлах .arch»| Ключевое слово | Контекст | Эффект | Глава |
|---|---|---|---|
type | Верхний уровень | Объявляет тип | 16 |
in | Заголовок модуля / процесса | Привязывает декларацию к родительскому модулю, объявленному в другом месте | 4, 7 |
aspect | Тело | Открывает конструкцию аспекта — членство или классификацию, инлайн или блоком (aspect k: v / aspect { … } / aspect k for …); заменяет собой labels | 9 |
required | Тело типа | Обязательный пустой слот — экземпляр должен заполнить или сбросить | 17 |
cascade | Тело типа, модификатор поля | Значение поля растекается к потомкам с семантикой переопределения | 18 |
cascade * | Тело типа, модификатор поля | Объявляет корень каскад-группы; подполя под этим путём входят в группу, а замена корня сбрасывает группу | 18 |
append | Тело типа, модификатор поля | Значение поля композируется со значениями потомков | 18 |
override | Тело | Заменить унаследованную сущность на тип не-подтипа | 19 |
drop | Тело | Удалить унаследованную сущность из этой области и ниже | 19 |
process | Верхний уровень / тело модуля | Объявляет процесс | 7 |
subprocess | Верхний уровень / тело модуля / тело процесса | Объявляет переиспользуемый подпроцесс | 7 |
on | Заголовок подпроцесса | Объявляет параметр шаблонного вызывающего-по-умолчанию (subprocess X on Caller) | 7 |
do | Тело процесса | Вклеить подпроцесс (без владельца; необязательный префикс — шаблонный вызывающий-по-умолчанию) | 7 |
if, else | Тело процесса | Исключающая условная ветвь | 7 |
select | Тело процесса | Многопутевая инклюзивная ветвь по метке case (запускается каждый подходящий вариант) | 7 |
one | Тело процесса | Модификатор select one / первый-подходящий на select | 7 |
parallel | Тело процесса | Параллельные ветви (с префиксным условием слияния) | 7 |
branch | Тело процесса | Именованная или анонимная ветка внутри parallel | 7 |
join, race, out | Тело процесса | Условия слияния parallel — продолжить-и-оставить / продолжить-и-отменить / отсоединить | 7 |
each | Тело процесса | Итерация; each <bound> try/catch/else — форма повтора | 7 |
try, catch | Тело процесса | Путь обработки ошибки (страж, продолжить вперёд) | 7 |
await | Тело процесса | Ожидание по времени / события, принадлежит ожидающему | 7 |
reversible | Тело процесса | Пролёт-сага; завершённые шаги откатываются при сбое | 7 |
unwind | Тело процесса | Обратное действие, спаренное с прямым шагом (встроенный catch-and-rethrow) | 7 |
as | Тело процесса | Именует шаг для go / диффа (> X.y as checkpoint) | 7 |
go | Тело процесса | Снова войти в именованный шаг и продолжить вперёд (без владельца) | 7 |
dist | Тело процесса | Позиция владельца: распределённое / эмерджентное управление (без координатора) | 7 |
fail, finish | Тело процесса | Завершение ветки с явным исходом (неудача / успех) | 7 |
view | Верхний уровень | Объявляет проекцию | 8 |
focus | Тело проекции | Отмечает совпадающие элементы для визуального акцента — никогда не меняет, какие узлы выбирает проекция | 8 |
group | Тело проекции | Группировать по значению геттера (используется с by) | 8 |
by | Тело проекции | Спутник group | 8 |
layout | Тело проекции | Устаревшее — зарезервировано, но больше не действует; разбирается только для того, чтобы выдать диагностику с заменой (закрепить позицию через style) | 8 |
include | Тело проекции | Устаревшее — зарезервировано, но больше не действует; разбирается только для того, чтобы выдать диагностику с заменой (выбирать через show) | 8 |
exclude | Тело проекции | Устаревшее — зарезервировано, но больше не действует; разбирается только для того, чтобы выдать диагностику с заменой (выбирать через hide) | 8 |
true, false | Значения полей/аспектов | Логические литералы | 9 |
Ключевые слова импорта и манифеста
Заголовок раздела «Ключевые слова импорта и манифеста»Они допустимы как в манифесте package.archspace, так и в начале файла .arch (кроме dependencies, который только манифестный).
| Ключевое слово | Контекст | Эффект | Глава |
|---|---|---|---|
use | Манифест / файл .arch | Импорт типов из другого пакета | 11 |
from | Клауза use | Указывает исходный пакет | 11 |
as | Клауза use | Локальное переименование | 11 |
export | Декларация типа / интерфейса / подпроцесса, клауза use | Делает элемент видимым для импортёров / других пространств / реэкспорт | 11, 16 |
dependencies | Манифест | Открывает блок зависимостей | 11 |
policies | Манифест | Открывает блок принятых паков политик — policies { pack.name: "1.2.0" }, каждый пак закреплён на объявленной им версии | 32 |
package, name, version, widgets, repo и commit распознаются как имена полей манифеста, но не зарезервированы — они нигде не затеняют идентификаторы. repo: и commit: закрепляют репозиторий и ревизию, по которым проверяются привязки sources: этого пакета (Глава 37).
Ключевые слова, ограниченные контекстом
Заголовок раздела «Ключевые слова, ограниченные контекстом»Некоторые ключевые слова разрешены только в определённых телах. Использование вне контекста — ошибка разбора.
| Ключевое слово | Разрешено только в |
|---|---|
each, if, else, select, one, try, catch, parallel, branch, join, race, out, await, reversible, unwind, on, do, go, as, dist, fail, finish | Телах процессов / подпроцессов |
focus, group, by, layout, include, exclude | Телах проекций |
cascade, append, required | Телах типов |
(as также допустимо в клаузе импорта use … from … as; on — только в процессах: параметр-вызывающий подпроцесса использует on, а не by.)
Ключевые слова проекций и запросов (контекстные)
Заголовок раздела «Ключевые слова проекций и запросов (контекстные)»Эти заголовки распознаются по позиции — в клаузе view или в слоте
тела — а не как жёсткие зарезервированные слова; каждое остаётся обычным
допустимым идентификатором в любом другом месте. Полную грамматику см. в
Приложении A: Грамматика §Декларации
проекций.
| Ключевое слово | Эффект |
|---|---|
show | Объединяет совпадения селектора в проекцию |
hide | Вычитает совпадения селектора из проекции |
style | Универсальное правило перестилизации — переопределения полей, rename, pin, use <bundle> над совпадениями селектора |
group / by | Группирует проекцию по повторению — group by @@team группирует по ЗНАЧЕНИЮ геттера с сигилом, group by in <selector> — по ВЛОЖЕННОСТИ (селектор называет контейнеры, по одной рамке на каждый) |
on | Выбирает плоскость(и), на которой располагается проекция — одна = доска плоскости, несколько = плетение (weave) |
table / matrix / grid / flow | Клауза представления проекции (не более одной на проекцию) — табличное / матрица зависимостей / кросс-таблица / поток процесса |
sequence | Токен режима flow — представление в виде вертикальных линий жизни |
bpmn | Токен режима flow — представление дорожками/пулами; открывает тело lane/pool |
lane | Тело bpmn-потока — одна полоса исполнителя (селектор, именованное слияние или by <getter>) |
pool | Тело bpmn-потока — один пул на значение геттера (by <getter>), именованное слияние запроса или ссылка на один элемент |
column | Тело table — столбец-геттер (редактируемый) или вычисляемый столбец (только для чтения) |
sort | Тело table — sort by <getter> упорядочивает строки |
axis | Тело matrix — задаёт общую КВАДРАТНУЮ ось геттером |
rows / cols | Тело matrix / grid — задаёт одну ось геттером (у прямоугольной матрицы нет order / cluster) |
order | Тело matrix — order by cluster / order by layer запускает SCC + топологический анализ, order by <getter> сортирует по значению |
cluster | Тело matrix — обводит циклы на диагонали; подразумевает order by cluster |
color | Тело grid — подкрашивает элементы ячеек по третьему геттеру |
knob | Объявляет параметр проекции — слайдер, выпадающий список, выбор элемента по типу или блок перечисления |
lens | Блок вычисляемых значений инспектора — lens { name: <expr> } |
story | Объявляет направляемый обход проекции — story { chapter … }, не более пяти глав. Это не клауза представления: она сочетается с table/matrix/flow, а не заменяет их, и инертна, пока просмотрщик не открыт с ?present=1 (Глава 36) |
chapter | Тело story — chapter "Заголовок" { "заметка" <селекторы узлов> }; первая строка это заметка, а написанный порядок узлов и есть порядок повествования |
pin | Тело style — WYSIWYG-позиция (перетаскивание записывает её) |
rename | Тело style — задаёт отображаемую подпись |
bundle | style bundle <Name> { … } — объявляет переиспользуемое тело стиля |
Ключевые слова политик и селекторов (контекстные)
Заголовок раздела «Ключевые слова политик и селекторов (контекстные)»Эти заголовки распознаются по позиции — внутри тела policy или внутри
общей грамматики селекторов/выражений (Приложение A, §Декларации
селекторов, §Выражения) — а не как жёсткие зарезервированные слова.
Селекторы лежат в основе как view (show/hide/focus/style), так и
policy. in и on — единственное исключение в этом списке: оба уже
являются жёсткими зарезервированными ключевыми словами, разобранными выше,
и здесь переиспользуются как предикаты селектора in <container> /
on <plane> — это не новые контекстные слова.
| Ключевое слово | Эффект |
|---|---|
policy | Объявляет политику — запрос над моделью, выдающий находки |
query | Объявляет именованный переиспользуемый селектор — query Name: <selector> |
forbid | Правило политики — находка на каждый совпавший узел/ребро |
require | Правило политики — require <subject>: <obligation>, находка при невыполнении; также require review from … в when |
except | Правило политики — оговорка над селектором (причина обязательна) |
escalate | Правило политики — повышает степень серьёзности политики |
when | Открывает гейт изменений — when <selector> added|removed|changed(…) { … } — вычисляется над диффом база→голова |
review | Внутри тела гейта when — require review from … |
severity | Поле заголовка политики — error / warning / advisory |
violating | Атом селектора — активные находки политики (violating <Policy>) |
and, or, not | Булевы операторы селектора / выражения |
in | Предикат селектора — структурное вложение / участие в процессе (жёсткое ключевое слово, переиспользуется — см. примечание выше) |
on | Предикат селектора — членство в плоскости (жёсткое ключевое слово, переиспользуется — см. примечание выше) |
within | Суффикс на переходе стрелки — ограничивает конус достижимости >>/<> (within 2) |
where | Предикат селектора — булево выражение для каждого кандидата (where (…)) |
exists | Выражение — истинно, если селектор находит хотя бы один элемент |
this | Связанный субъект внутри предиката / правила политики |
outside | Атом селектора — элементы, не выбранные в этой проекции |
sources | Голова извлечения в селекторе — sources of (<selector>), исходные концы совпавших рёбер (см. примечание ниже: у слова есть второе, не связанное с этим значение) |
targets, nodes, owners | Извлечение селектора — <слово> of (<selector>) |
of | Спутник извлечения, агрегатов и require review from N of <key> |
count, distinct | Агрегат — count (<selector>) / count distinct <getter> of (<selector>) |
sum, min, max | Агрегат — <слово> <getter> of (<selector>) |
Два значения слова sources
Заголовок раздела «Два значения слова sources»Слово sources называет в ArchLang две не связанные между собой вещи. Ни одна не затеняет другую, потому что они читаются в разных синтаксических позициях:
| Запись | Позиция | Значение |
|---|---|---|
sources — голова извлечения в селекторе | перед of (, внутри селектора | Исходные концы совпавших рёбер — sources of (@@zone:"pci" >> *). Родственник targets / nodes / owners (Глава 31) |
sources: — поле-свидетельство | в позиции поля в теле модуля | Диапазоны файлов в репозитории кода, которые свидетельствуют об этом модуле — sources: "src/checkout/index.ts:12-88". Обычное поле, вообще не ключевое слово (Глава 37) |
Голова извлечения это контекстное ключевое слово: она связывается только непосредственно перед of (. Поле-свидетельство это обычное имя поля, ровно как latency или owner, и могло бы называться как угодно. Поэтому sources of (…) внутри селектора и sources: "…" внутри тела модуля никогда не сталкиваются, а модуль волен нести это поле независимо от того, использует ли хоть один селектор в воркспейсе извлечение.
Что не является ключевым словом
Заголовок раздела «Что не является ключевым словом»Пользовательские типы — service, database, rest_create, rest_read и т.д. — не ключевые слова. Это идентификаторы, вводимые декларациями type module … / type surface … / type interface …. Разборщик контекстно сопоставляет их с активным реестром типов.
Три базовых типа module, surface, interface тоже не ключевые слова. Они выступают как родительские типы в type module service { … } и могут использоваться напрямую для объявления обобщённых экземпляров. (surface — тип-группировка поверхности API, Глава 6 — один из них, поэтому это обычный идентификатор, а не зарезервированное слово.)
Имена зарезервированных ключевых слов
Заголовок раздела «Имена зарезервированных ключевых слов»Пользовательские типы, поля и аспекты не могут переиспользовать зарезервированные ключевые слова. Попытка объявить type module process { ... } или использовать required как ключ аспекта — ошибка разбора.
См. также
Заголовок раздела «См. также»- Приложение A: Грамматика — EBNF для каждой конструкции
- Приложение C: Типы стандартной библиотеки — встроенные типы (не ключевые слова, но доступны по соглашению)