Параметры по умолчанию в функциях QPILE

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

Правила языка QPILE не позволяют объявить в описании функции параметры по умолчанию. Использование препроцессора позволяет восполнить этот недостаток.

Функции нередко имеют довольно большое количество формальных параметров. Многие языки программировния  имеют возможность при вызове функции некоторые параметры пропускать - в этом случае будут подставлены значения по умолчанию. В QPILE такой возможности нет, однако её можно реализовать при помощи препроцессора.

Допустим, имеется библиотечная (то есть написанная однажды и используемая  в разных портфелях) функция с 8ю параметрами.

FUNC LIB_FUNCTION(p1,p2,p3,p4,p5,p6,p7,p8) 

Каждый раз при её вызове все эти параметры приходится указывать явно. Очевидно, что держать в памяти последовательность их указания невозможно и постоянно приходится смотреть, какой параметр каким по счету указан и что там должно передаваться. Хотя в большинстве случаев реально нужны первые два-три из них, остальные требуются лишь для особых случаев.

Идея довольно проста. Переименовываем функцию в похожее, но слегка отличающееся имя. Например, добавим лидирующий символ подчеркивания. Для заполнения пропущенных параметров используем директиву препроцессора ifelse. Для случая функции с одним параметром и значением по умолчанию 123456 макрос может выглядеть как-то так:

define(`LIB_FUNCTION',`_LIB_FUNCTION (ifelse($1,,123456,$1)')

То есть вызов функции будет изменен на новый (с подчеркиванием вначале) и будет произведена проверка наличия параметра при вызове. Если в эту функцию какой-то параметр передан, он останется без изменений. Если параметр отсутствует, будет подставлено значение по умолчанию (в нашем случае 123456).

Для функции с двумя параметрами макрос будет нисколько не сложнее, но чуть длиннее: 

 define(`LIB_FUNCTION',`_LIB_FUNCTION (ifelse($1,,123456,$1), ifelse($2,,"abcdef",$2)')  

 

Все абсолютно так же, но проверяются уже 2 параметра (значение по умолчанию для второго - "abcdef")

Не составит труда добавить проверку третьего и всех остальных параметров.

 

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


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

Библиотека