Перейти к основному содержимому
Версия: 7.0

Brief: метапрограммирование

META и вызов метакода (@)

Метакод — блок кода lsFusion с параметрами, порождающий при использовании другой код. Объявляется инструкцией META — имя, список параметров, последовательность инструкций, завершающее END; используется инструкцией @, которая называет метакод и передаёт аргументы: каждый параметр метакода заменяется на переданный аргумент во всех местах использования.

Кроме подстановки, в метакоде есть операции над лексемами: ## объединяет две соседние лексемы в одну, ### делает то же, переводя первый символ второй лексемы в верхний регистр, кроме случая, когда все слева оказалось пустым, а сам токен не начинается с ###: тогда капитализация пропускается, и prefix###name при пустом prefix даёт name, а не Name. Ими собираются имена порождаемых элементов. Механизм — метапрограммирование.

Аналогия: макрос с текстовой подстановкой параметров.

META objectProperties(object, caption)
object##Name 'Имя '##caption = DATA BPSTRING[100](object);
object##Value 'Стоимость '##caption = DATA INTEGER (object);
END

@objectProperties(Document, 'документа'); // DocumentName 'Имя документа' = ...

Порождаемый код и аргументы вызова

Тело метакода состоит из инструкций уровня модуля, и сама инструкция @ пишется на уровне модуля: метакод порождает объявления элементов системы, а не операторы внутри тела действия.

Отсюда два типовых применения: семейство однотипных объявлений для переданного класса или префикса и набор элементов, добавляемый на произвольную форму через EXTEND FORM с именем формы в параметре (Brief: расширения).

Аргументом вызова может быть составной ID, идентификатор класса, литерал или пустой параметр — но не значение свойства: выбор поведения по данным делается не метакодом, а абстрактными свойствами и действиями.

Среда разработки дописывает после вызова @ порождённый код в фигурных скобках, чтобы работали навигация и анализ; платформа этот блок игнорирует и формирует код заново, поэтому править его вручную нельзя.