SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 1108|回复: 4
打印 上一主题 下一主题

有个关于宏的问题

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2004-5-13 16:10:24 | 只看该作者

有个关于宏的问题

看如下代码:
%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不是一样的呢?
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2004-5-13 16:17:27 | 只看该作者
因为data step里&var变成了'1,2,3',var1=&var;就等价与var1='1,2,3';,var自然就是1,2,3这样一个字符串啊。

可能你应该写成
var1='&var';
var1=quote(&var);
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2004-5-13 16:49:27 | 只看该作者
多谢!



还有个问题:
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是数值型的啊。不解。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2004-5-16 08:07:01 | 只看该作者
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.
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
5#
 楼主| 发表于 2004-5-16 13:07:02 | 只看该作者
SAS Macro  的基本原理是文本替换,而不是函数调用。这意味着包含宏的SAS程序在被解释执行之前,正如xic解释的那样,先通过宏替换过程把程序中的宏变量都替换成常量,然后再交给解释执行过程;很多对宏的困惑的根源实际也就是把宏替换和解释执行的过程混在一起考虑了,而不少SAS Macro的教程对这一点的确也强调得不够。
不过说到“it is SAS specific, not similar to any other languages”,倒有不同的看法,宏替换的方法在SAS出现之前就早已出现在计算机语言中,现在也很普遍,比如现在操作系统的shell脚本,就是大量使用宏替换,其它的一些支持编程脚本的分析软件也都有对应的语言,就连SAS的近邻SAP,也有相应的机制。只不过Macro在SAS语言中的地位比较重要,所以“显得”突出一些。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2025-1-9 23:54 , Processed in 0.105750 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表