1. Общее описание
Как описывалось выше (см. п.3.1 статьи «Общие принципы») один модуль = один файл = один класс. Соответственно здесь будет описана общая структура файла.
Модуль состоит из строковых выражений, корневых блоков и пустых строк.
2. Пустые строки
Пустые строки состоят из пробелов и комментариев. Пустые строки при компиляции игнорируются.
3. Строковое выражение
Строковое выражение может быть описанием класса, назначением псевдонима, описанием поля или константы.
У строкового описания нет единых правил оформления, особенности оформления смотрите в соответствующих главах.
4. Блоки
Корневым блоком может быть описанием функции, юнит-тестом, описанием импорта.
Блок состоит из более чем одной строки, блоки могут быть вложенные. Общая лексическая структура такова:
<Описание блока>:
<Строковое описание>
<Строковое описание>
...
<Строковое описание>
То есть, в первой строке идёт описание блока, заканчивающееся двоеточием. Далее в последующих строках идут одинаковые отступы и строковые описания. После окончания блока идут строковые описания блока верхнего уровня с отступами блока верхнего уровня. У корневых блоков модуля отступ равен 0 символов. У блоков более нижнего уровня отступ всегда больше чем у блоков верхнего уровня.
5. Пример
Пример программы:
класс расширяет Базовый
использовать Кар как Ат
стат функция запустить(массив(строка) Параметры) возвращает число:
константа КоличествоПараметров = 3
// Пустая строка. Здесь может быть сколько угодно пробелов и комментов.
если (Параметры.Длина не равно КоличествоПараметров):
Ат.Печатать("Кол-во параметров программы должно быть равно 3.%н")
В данном примере первая строка является строковым выражением, описывающим класс. Далее другое строковое выражение с назначением псевдонима. И, наконец, идет блок, описывающий функцию запустить. Внутри блока функции находится строковое выражение, описывающее константу, пустая строка и далее вложенный блок «если».
6. Разбиение одной строки на несколько
Способы разбить одну строку на несколько:
- Комментарий сильнее символа новой строки. Это означает, что в любом месте, где разрешен пробельный символ можно с помощью комментария разделить одну строку на две. Например:
поле Количество = /*
*/ 5
2. Скобки сильнее символа новой строки:
стат функция ПосчитатьСумму(
число Слагаемое1,
число Слагаемое2
) возвращает число:
3. Можно поставить в конце строки знак «».
7. Запрет кольцевых вызовов
Картарский язык программирования является языком с ограниченным сборщиком мусора. На самом деле как таковой сборщик мусора отсутствует. Фактически каждый ссылочный объект имеет свой счётчик и удаляется, если он становится равен нулю.
Однако, при таком подходе возникает проблема кольцевых зависимостей. Так как если объект А ссылается на объект Б, а объект Б ссылается на объект А, то счётчики ссылок на эти объекты никогда не удалятся. В том числе если эти объекты имеют один и тот же тип.
Чтобы обойти эту проблему, компилятор будет искать такие зависимости в проекте и выдавать ошибки времени компиляции при их нахождении.
Часто бывает все-таки нужно создать структуру с кольцевой зависимостью. Для этого есть «хак» — типы данных дерево и граф. Этого вполне достаточно практически для любой задачи.
Остается только проблема кольцевых зависимостей проекта. Проект А создает класс из проекта Б, а тот в свою очередь создает класс из проекта А. Задача поиска и исправления таких зависимостей остается на плечах разработчика.