Статические переменные в QPILE

Опубликовано в M4

Во многих языках программирования имеется понятие статической переменной. В QPILE такого понятие нет. Можно попробовать создать этот механизм.

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

Формулируем условия задачи.

  • Переменная должна быть видна только из текущего модуля
  • Переменная должна сохраняться между итерациями портфеля

Используем уже описанный макрос Local и встроенную функцию qpile New_Global().

define(`Static',`Local(`$1')new_global("$1",m4_default(`$2',""))')

 

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

Пример:

Func A()
   Static(Var,0)
   Var = Var + 1
End Func

Func B()
   Static(Var,0)
   Var = Var + 1
EndFunc

Две функции с абсолютно одинаковым текстом. В каждой из них имеется своя статическая переменная Var. В результате объявления ее статической (применения макроса Static) мы получаем 2 совершенно разные глобальные переменные с локальной видимостью. При каждом вызове одной из функций значение соответствующей переменной увеличивается на единицу. Получается, что каждая переменная является счетчиком вызовов соответствующей функции.

И хотя обе переменные имеют одно и то же имя, область видимости у каждой своя и конфликтов не будет.

Основная область применения - функции библиотек, когда требуется их сделать максимально автономными и исключить любые конфликты между собой и с главным модулем программы.

Другое применение - профайлер QPILE.

Вот еще один пример использования статической переменной. Во время исполнения программы на qpile могут возникнуть ситуации, когда необходимо о чем-то проинформировать пользователя. Например, невозможно прочитать какой-то файл или иная проблема, которая может возникать на каждой итерации портфеля. Можно каждый раз создавать сообщение посредством функции message. Однако эти сообщения будут выскакивать на экран ежесекундно и любого пользователя доведут до белого каления, не давая ему ничего сделать. Поскольку пользователь - объект, требующий особого внимания и заботы, необходимо оградить его от таких неприятностей. Пропустим все повторяющиеся сообщения:

FUNC _message(result)
Static(m4_msg_cache)
if result != m4_msg_cache
m4_msg_cache = result
message(result,1)
end if
EndFunc(result)

См. также Локальные переменные в QPILE

 


Конечно, это странно слышать, тем не менее жизнь была и до открытия РТС Крутой

 

Добавить комментарий


Защитный код
Обновить

Библиотека