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

Выполнение программного кода (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; }