Комментарии 9
Подскажите, пожалуйста, а почему никто не пользуется PROC FCMP, которая упомянута в статье? За несколько лет в нескольких компаниях видел три с половиной самописных функции и ни одного call routine. Компании и программисты, чей код я смотрел, без преувеличения, мирового уровня, но почему-то предпочитают макросы. С чем это связано? Слишком консервативное сообщество, а эта штука появилась недостаточно давно?
Спасибо, я думаю примерно так же — про макросы знают все, а про FCMP почти никто. А ведь штука удобная, особенно близка тем, кто перешел с классических языков. Как раз в такой ситуации я ее и откопал:) Но потом перешел на макросы — негласные договоренности по стилю и по тому, что можно. SQL нежелательно, регулярки только в экстремально сложных случаях, FCMP вообще никто в глаза не видел, пришлось избегать и писать влоб.
%macro test_macro;
proc sql noprint;
select count(*), sum(height) into :cnt, :hght from sashelp.class
where age <= (select age from sashelp.class where name = &name);
quit;
%mend;
proc fcmp outlib=work.func.test;
subroutine test_func(name $, cnt, hght);
outargs cnt, hght;
rc=run_macro('test_macro', name, cnt, hght);
endsub;
run;
options cmplib=work.func;
data test;
set sashelp.class(keep=name);
call missing(count, hight_sum);
call test_func(name, count, hight_sum);
run;
Да, это отличная возможность, спасибо.
Как-то писал функцию, которая по формату вызова совпадала с обычным put, но писала не в лог, а в датасет. Т.е. вся грязь из данных из пары десятков программ оказывалась в одном месте. Там из макроса вызывалась FCMP, откуда вызывался макрос, который мог писать в датасет, не объявленный на текущем шаге данных. В продакшн, увы, не пошло — чую, производительность хромала — столько вложений, да еще и времени выполнения, а не компиляции:)
Кстати, как идея для статьи — время выполнения и время компиляции. Мои коллеги, например, пугаются, видя putn при динамическом выборе формата
Основы программирования на SAS Base. Урок 4. Создание наборов данных SAS