SAS中文论坛

标题: 有个关于宏的问题 [打印本页]

作者: shiyiming    时间: 2004-5-13 16:10
标题: 有个关于宏的问题
看如下代码:
%macro abc(var);
data _null_;
var1=&var;
call symput('var1',var1);
run;

%put &var;
%put &var1;

%mend;

%abc('1,2,3');

输出的结果是:
'1,2,3'
1,2,3

请教:为什么var和var1不是一样的呢?
作者: shiyiming    时间: 2004-5-13 16:17
因为data step里&var变成了'1,2,3',var1=&var;就等价与var1='1,2,3';,var自然就是1,2,3这样一个字符串啊。

可能你应该写成
var1='&var';
var1=quote(&var);
作者: shiyiming    时间: 2004-5-13 16:49
多谢!



还有个问题:
data a;
input id;
cards;
1
2
3
4
5
;
run;

%macro abc;
%let i=1;
%do %while(&i<=5);
data a_&i;
set a;
if id=&i;
run;

data _null_;
i1=&i+1;
call symput('i',trim(left(i1)));
run;
%end;
%mend;

%abc;

这个程序是没问题的,我的疑问就是call symput('i',trim(left(i1)))中,宏变量i应该是字符型的,因为它经过left函数处理,怎么还可以和变量id匹配呢?id是数值型的啊。不解。
作者: shiyiming    时间: 2004-5-16 08:07
It is something many SAS programmers got confused all the time.  When you say that a macro variable is a character variable, it implies that some macro variable can be numeric. Is there any numeric macro variables?  None.  Besides, eventhough all the macro variables are in character format, it is treated differently compared with the character variables in data set.  Your previous question gave a good example.  For character variable in data set, X='ABC' give the value ABC to X; for a macro variable %let X='ABC' gives value 'ABC' to macro variable X.  The best way to understand macro variable is to think macro language to be a tool to generate SAS program syntax, so if &i=5, the SAS statement IF ID=5; has no problem at all.  For many SAS novice users, it may take some time to be comfortable with it, since it is SAS specific, not similar to any other languages.
作者: shiyiming    时间: 2004-5-16 13:07
SAS Macro  的基本原理是文本替换,而不是函数调用。这意味着包含宏的SAS程序在被解释执行之前,正如xic解释的那样,先通过宏替换过程把程序中的宏变量都替换成常量,然后再交给解释执行过程;很多对宏的困惑的根源实际也就是把宏替换和解释执行的过程混在一起考虑了,而不少SAS Macro的教程对这一点的确也强调得不够。
不过说到“it is SAS specific, not similar to any other languages”,倒有不同的看法,宏替换的方法在SAS出现之前就早已出现在计算机语言中,现在也很普遍,比如现在操作系统的shell脚本,就是大量使用宏替换,其它的一些支持编程脚本的分析软件也都有对应的语言,就连SAS的近邻SAP,也有相应的机制。只不过Macro在SAS语言中的地位比较重要,所以“显得”突出一些。




欢迎光临 SAS中文论坛 (http://mysas.net/forum/) Powered by Discuz! X3.2