Существует функция %SYMEXIST(macro-var-name)
макросов, чтобы увидеть, существует ли макро-var, но вы не можете писать %IF
в открытую, поэтому вы должны заключить свой оператор %IF
внутри какого-либо другого макроса. Вы можете написать макрос, чтобы обернуть свой код в исходный файл, как показано ниже. Это некрасиво, но, возможно, вы справитесь с этим, если понадобится охранник.
%macro wrapper;
%if %symexist(foo_defined) %then %return;
%macro foo;
%global foo_defined;
%let foo_defined = 1;
%put i am foo;
%mend foo;
%mend wrapper;
%*-- tests --*;
options mcompilenote=all;
%symdel foo_defined;
%*-- first time it will define %foo --*;
%wrapper
%foo
/* on log
NOTE: The macro FOO completed compilation without errors.
6 instructions 108 bytes.
i am foo
*/
%*-- second time it will not --*;
%wrapper
%foo
/* on log
(no notes on macro compilation)
i am foo
*/
При вызове SAS делает доступную кучу каталогов, файлов и директорий для доступа (составитель/не компилируется) макросов. Это делает громоздким, но не невозможным, прямое обнаружение макроса уже доступно для этого сеанса или нет, учитывая имя макроса. Читайте о деталях (gory) в этой статье: http://support.sas.com/resources/papers/proceedings09/076-2009.pdf
Спасибо. Это в значительной степени подход, к которому я стремился. –