Как стать автором
Обновить

Комментарии 9

Подскажите, пожалуйста, а почему никто не пользуется PROC FCMP, которая упомянута в статье? За несколько лет в нескольких компаниях видел три с половиной самописных функции и ни одного call routine. Компании и программисты, чей код я смотрел, без преувеличения, мирового уровня, но почему-то предпочитают макросы. С чем это связано? Слишком консервативное сообщество, а эта штука появилась недостаточно давно?

Спасибо за интересный вопрос и за идею к новой статье! :-) Макросы и PROC FCMP дают возможность вводить дополнительные абстракции в программу (то есть, обернуть код и вызывать его одной строкой). Такую задачу можно решить с помощью макроса или же с помощью функции. В большинстве практических случаев их возможности пересекаются. Сама процедура FCMP может быть не видна в программе, а пользовательские функции по синтаксису не отличаются от встроенных функций SAS, поэтому пользователь вообще не видит её присутствие. PROC FCMP вполне возможно применяется не так обширно, поскольку доступно ограниченное количество информации в сравнении с другими темами SAS, теми же макросами – про них знают все.

Спасибо, я думаю примерно так же — про макросы знают все, а про FCMP почти никто. А ведь штука удобная, особенно близка тем, кто перешел с классических языков. Как раз в такой ситуации я ее и откопал:) Но потом перешел на макросы — негласные договоренности по стилю и по тому, что можно. SQL нежелательно, регулярки только в экстремально сложных случаях, FCMP вообще никто в глаза не видел, пришлось избегать и писать влоб.

Бывает нужно вызвать из datastep/sql другую процедуру. Это как раз можно сделать через связку proc fcmp + macro через функцию run_macro. Например:

%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 при динамическом выборе формата

Поняла! Будет статья! Спасибо за идею!
По продуктам DataFlux что-то планируется в блоге?
Добрый день!
Не могу ответить на этот вопрос, обязательно уточню у коллег!
Зарегистрируйтесь на Хабре, чтобы оставить комментарий