* При перепечатке материалов ссылка на www.SeoLiga.ru обязательна!
Расширение интерпретатора выражений
19 февраля 2009
Построитель интерпретатора выражений также может быть расширен для ваших собственных функций. В действительности, все функции интерпретатора выражений реализованы, как add on функции, полностью отсутствуют какие либо функции внутри кода интерпретатора. Создание дополнительных функций состоит из двух шагов:
• Написать функцию класс, наследник от TQREvElementFunction • Зарегистрировать функцию Имеется два базовых типа add on функций простые функции и агрегатные функции. Оба типа функций могут быть с параметрами или без. Функции также могут получать переменное число параметров. Примеры различных типов функций: Simple without parameters Time Simple with parameters Str(<numeric>) Aggregated without parameters Count Aggregated with parameters Sum(<numeric>)
Простые функции Наиболее просто реализовать простую функцию, наследовать ее от TQREvElement (предок всех функций) и перекрыть функцию Calculate. Функция Calculate обязана возвращать, хоть какой ни будь результат. Реализация функции Time выглядит следующим образом: TQREvTimeFunction = class(TQREvElementFunction) public function Calculate : TQREvResult; override; end; function TQREvTimeFunction.Calculate : TQREvResult; begin Result.Kind := resString; Result.StrResult := TimeToStr(Now); end; Поскольку функция Time не может иметь ни одного параметра, то мы добавим проверку данного факта, и теперь реализация будет выглядеть так: TQREvTimeFunction = class(TQREvElementFunction) public function Calculate : TQREvResult; override; end;
function TQREvTimeFunction.Calculate : TQREvResult; begin if ArgList.Count = 0 then begin Result.Kind := resString; Result.StrResult := TimeToStr(Now); end else Result.Kind := resError; end; Переменная ArgList.Count содержит действительное количество параметров, которые были переданы в функцию. Доступ до параметров делается с помощью функции Arguments.