2009-09-28 7 views
3

В других языках программирования, таких как C++, включить защитные устройства, чтобы предотвратить множественные включения одного и того же кода.Макросы SAS включают в себя защитные устройства

Как это в C++:

#ifndef FOO_INCLUDED 
#define FOO_INCLUDED 
.... 
#endif 

Имеет ли смысл строить включения охранников в определениях макросов функций SAS? И как это сделать?

ответ

3

Существует функция %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

+0

Спасибо. Это в значительной степени подход, к которому я стремился. –

2

Вы можете использовать NOMREPLACE option для предотвращения переопределения любых макросов.

На мой взгляд, повторное использование имен макросов и имен макрокоманд (и даже имен наборов данных) является злым. Если вы определяете вещи только один раз, вы можете быть относительно уверены, что можете повторно отправить часть кода и ожидать получить те же результаты, что и первоначально. Я также предпочитаю хранить макроопределения отдельно от кода, из которого они вызваны.

+0

Этот параметр * не * предотвращает повторное определение макросов, которые находятся в ваших каталогах SASAUTOS .. если вы не вызываете макросы первым, то есть. Поскольку после его вызова макрос компилируется в каталог макросов в рабочей библиотеке, и только после этого этот параметр блокирует повторное определение. Сведения о том, какие макросы доступны для вызова с учетом сеанса, действительно являются gory. –