首页 > 解决方案 > 每次调用宏时如何告诉 SAS 编译宏而不是手动编译

问题描述

上下文:我们使用SAS 9.4and Enterprise Guide 7.15。目前,我们正在实施一些新的宏,当然必须在此过程中进行很多更改。有时更小,有时更大的变化。问题是,为了使更改生效,SAS需要我们手动编译宏代码或重新启动会话,这有点乏味。

这是我们主文件中的当前设置(调用所有宏):

/* Macro options */
     MAUTOSOURCE  sasautos = "<path to macro>" mlogic mlogicnest mprint mprintnest MRECALL

是否有可能在使用该MAUTOSOURCE */ sasautos =""选项时告诉SAS每次调用宏以实际编译宏而不是使用会话存储的宏?理想情况下,只有在执行主文件(等)中的整行代码时才会编译宏MAUTOSOURCE */ sasautos ="",否则它应该在会话中保留已编译的版本。

我发现这篇论文(The Autocall Macro Facility in the SAS for Windows Environment)在结论中指出

之后 SAS 将使用已经编译的代码。如果对宏进行了更改,则必须在更改生效之前再次对其进行编译。

我希望这并不意味着我必须手动完成。是否有任何宏选项可以设置?

标签: sassas-macro

解决方案


在 SAS 9.3 中,他们添加了%SYSMACDELETE宏功能。因此,如果您只想让自动调用重新定义单个宏,然后使用它来删除当前定义。

%symacdelete mymacro;

这是一个实用宏,它将查询 SASHELP.VCATALG 视图以在 WORK 库中查找已编译的宏并将其删除。它具有列出要删除或保留的宏名称的选项。请注意,普通 SAS 会话使用 WORK.SASMACR 来存储已编译的宏。但是 SAS/Studio 和 EG(可能还有其他运行 SAS 的方式)使用 WORK.SASMAC1 代替。

https://github.com/sasutils/macros/blob/master/macdelete.sas

%macro macdelete(delete,keep);
/*----------------------------------------------------------------------------
Remove compiled macros using %SYSMACDELETE macro statement.

Use DELETE parameter to list macro names to delete.
Use KEEP parameter to list macro names to NOT delete.
Calling it with no values will delete all macros not currently running.
----------------------------------------------------------------------------*/
%local libname memname objname objtype fid i;
%do i=1 %to %sysmexecdepth;
  %let keep=%sysmexecname(&i) &keep;
%end;
%if %length(&delete) %then %let delete=and findw("&delete",objname,',','sit');
%let fid=%sysfunc(open( sashelp.vcatalg(keep=libname memname objname objtype
 where=(libname='WORK' and objtype='MACRO' and memname like 'SASMAC_'
   and not findw("&keep",objname,',','sit') &delete))));
%if (&fid) %then %do;
  %syscall set(fid);
  %do %while(0=%sysfunc(fetch(&fid)));
    %put %sysfunc(compbl(Removing &objname from &libname catalog &memname));
    %sysmacdelete &objname;
  %end;
  %let fid=%sysfunc(close(&fid));
%end;
%else %put %qsysfunc(sysmsg());
%mend macdelete;

例子:

3348  %macro test1; %mend;
3349  %macro test2; %mend;
3350  %macro test3; %mend;
3351  %macro test4; %mend;
3352  %macdelete(test1 test3);
Removing TEST1 from WORK catalog SASMACR
Removing TEST3 from WORK catalog SASMACR
3353  %macdelete(keep=test2);
Removing TEST4 from WORK catalog SASMACR

运行 SAS/Studio 或 Enterprise Guide 时的示例:

 97         %macro test1; %mend;
 98         %macro test2; %mend;
 99         %macro test3; %mend;
 100        %macro test4; %mend;
 101        %macdelete(test1 test3);
 Removing TEST1 from WORK catalog SASMAC1
 Removing TEST3 from WORK catalog SASMAC1

推荐阅读