Выполнение программного кода (EVAL)
Оператор выполнения программного кода создает действие, которое во время работы сервера компилирует строку с исходным кодом на языке lsFusion и выполняет её внутри сервера с полным доступом к остальному проекту.
Исходный код
Строка трактуется как тело свежего модуля, сгенерированного платформой. Заголовок модуля платформа формирует автоматически: уникальное имя модуля плюс зависимости от всех загруженных на этот момент модулей. Поэтому код может ссылаться на любой элемент проекта и сам объявлять новые локальные элементы.
Принимаются две формы исходного кода — в зависимости от режима оператора:
- Режим инструкций (по умолчанию). Строка является последовательностью инструкций. Одна из них должна создавать действие с именем
run— именно оно и будет выполнено. Как обычное скриптовое действие,runможет объявлять интерфейсные параметры и получать через них значения. - Режим действия. Строка трактуется как тело действия — последовательность операторов-действий и объявлений локальных свойств, — которое платформа автоматически оборачивает в действие
run. Тело обращается к runtime-аргументам eval-действия позиционно.
Параметры
Действие, выполняющее программный код, принимает исходный код как свой первый параметр. Дополнительные значения, передаваемые оператору, становятся runtime-аргументами run при его вызове и подчиняются обычным правилам передачи параметров.
Область выполнения
Скомпилированное действие run выполняется синхронно в сессии вызывающего действия, поэтому его чтения и записи разделяют сессию, apply и транзакционное состояние с вызывающим.
Ограничения на выполняемый код
Выполняемый код предназначен для добавления новых локальных элементов и вызова существующих; постоянную структуру проекта он менять не может. В коде eval не могут появляться:
- объявления новых классов, таблиц и индексов
- глобальные события и ограничения, включая формы write-события и follows-ограничения, привязанные к объявлению свойства
- агрегации, а также режимы агрегации и равенства у группировки
- материализация, явное размещение в таблице и not-null ограничения на свойствах
- объявление группы с родительской группой из другого модуля или привязка свойства или действия к группе из другого модуля
- добавление базовых событий к существующим действиям
Data-свойства, объявленные внутри eval-кода, приводятся к области сессии; постоянные data-объявления не допускаются.
Язык
Для создания действия, выполняющего программный код, используется оператор EVAL.
Примеры
// тело действия задано напрямую
addProperty { EVAL ACTION 'MESSAGE \'Hello World\''; }
// произвольный скрипт, введённый пользователем
code 'Исходный код' = DATA BPSTRING[2000] ();
execute 'Выполнить код' { EVAL code(); }
// передача runtime-аргумента в выполняемое тело в режиме действия
greet 'Поприветствовать пользователя' (CustomUser u) { EVAL ACTION 'MESSAGE \'Здравствуй, \' + name($1);' PARAMS u; }