Макросы
Macro/EndMacro | UndefineMacro | MacroExpandedCount |
Macro <name> [(Parameter [, ...])] ... EndMacro
Описание
Макросы - очень мощная функция, главным образом полезная для опытных программистов. Macros - это метка-заполнитель для небольшого кода (ключевое слово, строка или несколько строк), который вставляется (при компилировании) непосредственно в программный код, где макрокоманда вызывается. В этом она отличается от процедур, поскольку процедуры не копируют код, когда их вызывают.
Объявление Macro : EndMacro должно быть сделано до первого вызова макроса. Так как макросы будут полностью заменены соответствующим кодом, во время компиляции.
Macros не может иметь по возвращению тип или параметры соответствующие образцу, так как это не имеет смысла. Если у макрокоманды есть параметры, они заменяются в коде на копию, переданную при вызове макроса. Очень важно понять: оценка строки начинается только тогда, когда будут обработаны все найденные в этой строке макросы.
Макросы разделены на две категории: простые (без параметров) и комплексные (с параметрами, при их вызове необходимо использовать скобки). Когда параметр не указан, возможно заменять любое слово, другим словом (или другим выражением). Макросы могут использоваться рекурсивным образом, однако если один из передаваемых параметров содержит #, он не будет работать.
Пример: Простой Макрос
Macro MyNot Not EndMacro a = 0 If MyNot a ; Здесь строка будет расширена следующим образом: 'If Not a' Debug "Ok" EndIf
Используя параметры, можно создать очень гибкие макросы. Символ логической связи # доступен для создания новых слов или меток, при соединении кода макроса и выражения переданного ему (пробелы между словами не учитываются). Также возможно определить значения по умолчанию, для каждого параметра, чтобы их можно было опустить во время вызова макроса.
Пример: Макрос с параметром
Macro UMsgBox(Title, Body) MessageRequester(Title, UCase(Body), 0) EndMacro Text$ = "World" UMsgBox("Hello", "-"+Text$+"-") ; Здесь строка будет расширена следующим образом: ; 'MessageRequester("Hello", UCase("-"+Text$+"-"), 0)'
Пример: Макрос с параметром по умолчанию
Macro UMsgBox(Title, Body = "Ha, no body specified") MessageRequester(Title, UCase(Body), 0) EndMacro UMsgBox("Hello") ; Здесь строка будет расширена следующим образом: ; 'MessageRequester("Hello", UCase("Ha, no body specified"), 0)'
Пример: Конкатенация Макросов
Macro XCase(Type, Text) Type#Case(Text) EndMacro Debug XCase(U, "Hello") Debug XCase(L, "Hello")
Пример: Сложный многострочный Макрос
Macro DoubleQuote " EndMacro Macro Assert(Expression) CompilerIf #PB_Compiler_Debugger ; Только включите, утверждают в режиме отладки If Expression Debug "Assert (Line " + #PB_Compiler_Line + "): " + DoubleQuote#Expression#DoubleQuote EndIf CompilerEndIf EndMacro Assert(10 <> 10) ; Ничего не выведет на экран Assert(10 <> 15) ; Должен вывести на экран утверждение
UndefineMacro <name>
Описание
UndefineMacro позволяет отменить ранее определенный макрос и переопределить его другим способом. Как только макросу отменили определение, он становится недоступен для использования.
Пример: Отмена определения макроса
Macro Test Debug "1" EndMacro Test ; вызов макроса UndefineMacro Test ; Отмена определения макроса, он больше не существует Macro Test ; Теперь мы можем переопределить макрос Debug "2" EndMacro Test ; вызов макроса
MacroExpandedCount
Описание
MacroExpandedCount позволяет получать расширенную информацию о макросе (число вызовов, макрос был расширен/назван). Может быть полезно для генерации уникальных идентификаторов в том же макросе для каждого вызова (как метка, имя процедуры и т.д.).
Пример: Расширенный счетчик
Macro Test Debug MacroExpandedCount EndMacro Test ; Вызов макроса Test ; Вызов макроса Test ; Вызов макроса