遇到一些不寻常的事情。我觉得这可能是我的一个愚蠢的错误,但对于我的生活,我无法弄清楚它可能是什么。
以下工作正常:
declare hash hash&foo1.&foo2.&foo3.&foo4.();
...
以下不起作用:
declare hash hash%do bar = 1 %to &nvars.;&&foo&bar..%end;();
...
它们似乎都解析为
declare hash hash1111();
但是后者抛出语法错误。有什么想法吗?具体错误是:
Line generated by the macro variable "FOO1".
1
Error 22-322: Syntax error, expecting one of the following: a name, (, ;.
...
declare hash hash1111();
NOTE: Line generated by the macro variable "FOO4".
hash1111
答案 0 :(得分:2)
如果我想生成代码片段,我会在使用片段之前执行此操作 以下代码仅供参考:
%macro test;
%global foobar;
%let foobar = ;
%let foo1 = 1;
%let foo2 = 1;
%let foo3 = 1;
%let foo4 = 1;
%let foobar = &foo1.;
%do bar = 2 %to 4;
%let foobar = %sysfunc(cats(&foobar., &&foo&bar..));
%put *&foobar.*;
%end;
%mend;
%test;
现在你可以随时随地使用macrovariable foobar。例如
declare hash hash&foobar.();
后续研究我终于在http://www2.sas.com/proceedings/sugi28/011-28.pdf
中找到了解决方案您需要取消引用宏循环。我不知道为什么,但以下代码正在运行:
%macro test3();
%global foobar;
%let foobar =;
%let foo1 = 1;
%let foo2 = 1;
%let foo3 = 1;
%let foo4 = 1;
data test2;
declare hash hash%unquote(%do bar = 1 %to 4;&&foo&bar..%end;)();
run;
%mend;
%test3;
SUGI论文的以下声明导致解决方案:
“无论如何,较旧的文件给出了简单的规则:
如果mprint看起来不错并且SAS编译器不理解它,那么尝试%UNQUOTE。“