Как цитирование макросов SAS взаимодействует с литералами формата?

Выполнение локально в чистой сессии:

%let x = %str(put(age, best.));

proc sql;
    select &x from sashelp.class;
quit;

Это вызывает следующую ошибку:

1     put(age, best.)
               ----
               22
                ----
                76
ERROR 22-322: Syntax error, expecting one of the following: a format name, ?.

ERROR 76-322: Syntax error, statement will be ignored.

Но эта версия с «ручным разрешением» работает без примечаний, предупреждений или ошибок:

proc sql;
    select put(age, best.) from sashelp.class;
quit;

Может ли кто-нибудь объяснить, что именно делает %str() в этой программе, что вызывает проблему во время выполнения? Извиняюсь за расплывчатый вопрос, но я не уверен, каковы соответствующие взаимодействия; Я не могу воспроизвести с использованием эквивалентного синтаксиса шага данных, поэтому, возможно, задействованы особенности proc SQL?


person jl6    schedule 21.06.2011    source источник


Ответы (5)


Функция %str() маскирует строку символов во время компиляции макроса. Удалите функцию %str() в операторе let или добавьте функцию %unquote() в sql select, чтобы разрешить правильное разрешение.

person Laurent de Walick    schedule 21.06.2011
comment
Но почему маскирование строки символов во время компиляции макроса может вызвать эту ошибку? Я ожидаю, что все цитирование макросов будет разрешено к моменту выполнения кода. - person jl6; 21.06.2011
comment
%str маскирует строки во время компиляции, а родственный %quote маскирует строки во время выполнения. Это что-то в сочетании proc sql, компиляции и выполнения макросов. В этом документе многое объясняется о цитировании макросов: www2.sas.com/proceedings/sugi28 /011-28.pdf - person Laurent de Walick; 22.06.2011

Отвечено на этот вопрос на runsubmit.com:

Я собираюсь отметить этот ответ как правильный, потому что он привел меня на эту страницу документации: http://support.sas.com/documentation/cdl/en/mcrolref/61885/HTML/default/viewer.htm#tw3514-unquote.htm - «В редких случаях маскирование текста с помощью функции цитирования макроса изменяет способ, которым сканер слов размечает текст... Сканер слов не использует его в качестве границы буквального токена во входном стеке». Откровенно говоря, звучит как ошибка, но если алгоритм токенизатора такой древний и волосатый, как я себе представляю, я бы тоже назвал его причудой!

person jl6    schedule 22.06.2011

Можете ли вы вместо этого использовать оператор формата? Например, это работает просто отлично.

%let x = %str( age format=best.);

proc sql;
    select &x. from sashelp.class;
quit;
person cmjohns    schedule 21.06.2011
comment
Пример несколько искусственный; Я знаю множество обходных путей, поэтому я действительно спрашиваю, ПОЧЕМУ возникает эта ошибка. - person jl6; 21.06.2011

По какой-то причине SAS не любит "лучшее". формат.

то есть, когда я пытаюсь это сделать, ваш код работает

 %let x = %str(put(age, 8.));

????

person richie    schedule 21.06.2011

Если вы добавите это в свой код

%put _user_ ;

вы увидите, как &x цитируется %str в журнале. Вот почему код proc sql не работает. Использование %Unquote в части select инструкции proc sql позволит выполнить код.

http://www2.sas.com/proceedings/forum2007/152-2007.pdf

person Jay Corbett    schedule 19.07.2011
comment
это действительно полезно - спасибо. Я думаю, вам нужно использовать «% put» вместо «put». - person Lauren Samuels; 20.07.2011