Как заставить SAS компилировать макрос каждый раз, когда он вызывается, вместо того, чтобы делать это вручную

Если вы сделаете захват по значению в лямбда, вы получите «член», который будет сохранен. Поскольку по умолчанию operator() является функцией const, вы не можете их изменять.

Lambdas может быть определен как []() mutable {}, чтобы вы могли изменять локальные переменные.

значение по ссылке, у вас есть что-то, что ведет себя как указатель const к объекту non-const, поэтому без изменчивого вы можете адаптировать эти объекты. (Если они уже не существуют)

1
задан user190080 1 April 2019 в 11:02
поделиться

2 ответа

В SAS 9.3 добавлена ​​макрофункция %SYSMACDELETE. Так что, если вы просто хотите, чтобы autocall переопределил один макрос, используйте его для удаления текущего определения.

%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:

 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
0
ответ дан Tom 1 April 2019 в 11:02
поделиться

Если вы удалите скомпилированный макрос из WORK. SASMACR SAS придется перекомпилировать макрос при повторном вызове.

proc catalog c=work.sasmacr;
   *contents;
   delete your-macro-to-recompile.macro;
   run;
   quit;
0
ответ дан data _null_ 1 April 2019 в 11:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: