В сценариях вы можете объявить и использовать пользовательские функции.
Объявление пользовательской функции состоит из списка формальных параметров и выражений, которые в совокупности представляют собой последовательность определённых операций, записанных пользователем. Результат всех этих операций вычисляется при каждом обращении к данной функции. Имена параметров, определённые в выражении функции, обрабатываются как обычные переменные.
Формальный синтаксис объявления пользовательских функций обеспечивается директивой 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]