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

Приложение B: Ключевые слова

Каждое зарезервированное ключевое слово в ArchLang, разделённое по тому, где оно распознаётся.

Ключевое словоКонтекстЭффектГлава
typeВерхний уровеньОбъявляет тип16
inЗаголовок модуля / процессаПривязывает декларацию к родительскому модулю, объявленному в другом месте4, 7
aspectТелоОткрывает конструкцию аспекта — членство или классификацию, инлайн или блоком (aspect k: v / aspect { … } / aspect k for …); заменяет собой labels9
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 / первый-подходящий на select7
parallelТело процессаПараллельные ветви (с префиксным условием слияния)7
branchТело процессаИменованная или анонимная ветка внутри parallel7
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Тело проекцииСпутник group8
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Тело tablesort by <getter> упорядочивает строки
axisТело matrix — задаёт общую КВАДРАТНУЮ ось геттером
rows / colsТело matrix / grid — задаёт одну ось геттером (у прямоугольной матрицы нет order / cluster)
orderТело matrixorder 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Тело storychapter "Заголовок" { "заметка" <селекторы узлов> }; первая строка это заметка, а написанный порядок узлов и есть порядок повествования
pinТело style — WYSIWYG-позиция (перетаскивание записывает её)
renameТело style — задаёт отображаемую подпись
bundlestyle 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Внутри тела гейта whenrequire 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 называет в 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 как ключ аспекта — ошибка разбора.