Препроцессор Inno Setup: Пользовательские функции

В сценариях вы можете объявить и использовать пользовательские функции.

Объявление пользовательской функции состоит из списка формальных параметров и выражений, которые в совокупности представляют собой последовательность определённых операций, записанных пользователем. Результат всех этих операций вычисляется при каждом обращении к данной функции. Имена параметров, определённые в выражении функции, обрабатываются как обычные переменные.

Формальный синтаксис объявления пользовательских функций обеспечивается директивой define. В файле ISPPBuiltins.iss вы найдете множество примеров этих функций.

Пожалуйста, обратите внимание, что при записи между именем функции и круглой открывающей скобкой не должно быть пробела.

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

Фактические параметры, объявленные в качестве ссылок (*), должны быть изменяемыми l-значениями (другими словами, это значение, полученное при помощи одного или нескольких аргументов операции). Если выражение функции изменяет параметр передаваемый по ссылке, то переменная, которая передается в качестве этого параметра, также изменяется. По значению параметров можно также изменить выражение функции (используя операторы присваивания), но это изменение не влияет на значение переменной, которая передается в качестве параметра.

Хотя пользовательская функция может содержать только одно выражение, но операторы последовательной оценки (comma), операторы присваивания (простые и сложные), а также условные операторы (?:) могут использоваться для построения более сложных функций.

Параметры функций и массивов

Параметр, объявленный с идентификатором типа func, принимает пользовательскую или встроенную функцию. Параметр, объявленный с идентификатором типа array, принимает переменную-массив. При вызове пользовательской функции, имеющей такой параметр, фактический параметр необходимо указывать с помощью оператора @, за которым следует имя передаваемого идентификатора. Например:

#define Apply(func Callback, str Value) Callback(Value)
#define Decorate(str S) "(" + S + ")"
#emit Apply(@Decorate, "hello") ; emits "(hello)"

И далее:

#dim MyData[3] {10, 20, 30}
#define Sum3(array A) A[0] + A[1] + A[2]
#emit Sum3(@MyData) ; emits 60
#define GetDim(array A) DimOf(A)
#emit GetDim(@MyData) ; emits 3

Локальный массив

В выражении функции допускается использовать дополнительный массив с именем Local. Его элементы могут быть задействованы в качестве временного хранения данных и повторного использования промежуточных значений выражения. Этот массив Local принадлежит только той функции, в которой он был вызван, и его данные недоступны за пределами самой функции, включая их сохранение.

Пример

#define DeleteToFirstPeriod(str *S) /* S передается по ссылке */ \
Local[1] = Copy(S, 1, (Local[0] = Pos(".", S)) - 1), \
S = Copy(S, Local[0] + 1), \
Local[1]

См. также:

Синтаксис выражений