楼主: Tigflanker
3505 1

[问答] 求助宏返回值的问题 [推广有奖]

  • 8关注
  • 18粉丝

副教授

49%

还不是VIP/贵宾

-

威望
0
论坛币
2321 个
通用积分
9.9128
学术水平
179 点
热心指数
194 点
信用等级
167 点
经验
27443 点
帖子
622
精华
0
在线时间
851 小时
注册时间
2011-3-27
最后登录
2023-5-14

楼主
Tigflanker 发表于 2013-10-31 19:36:36 |AI写论文
100论坛币
想问各位老师俩问题,如果有知道的,请给与明示,谢谢:)

代码如下:

  1. %macro a(a=);
  2.     data a;run;
  3.     &a. %return;
  4. %mend a;

  5. %macro b;
  6.   %put >>%a(a=a)<<;
  7. %mend b;
  8. %b;

  9. %put >>%a(a=a)<<;      *Error;
复制代码

这段小代码旨在用过宏b来调用宏a,使得将a的返回值 &a. PUT出来。

遇到两个问题:
1. 在调用%b的时候,log返回的是:>>data a;run;   a<< 而不是期待的 >>a<<。
    请问,我想让data a;run;这句生效,并且不让他返回,应该用什么办法“保护并运行”它呢?
2. 请问在open环境下直接用%put函数,为什么不行呢?
    %put >>%a(a=a)<<;   LOG提示:a

谢谢各位帮助,我问题常常较多,如有烦扰,还望大神们谅解:)

关键词:返回值 RETURN Macro Data turn return
Bye SAS.
若有缘,能重聚。

沙发
playmore 发表于 2013-11-1 08:32:02
SAS的宏和一般编程语言的函数不是一个东西

一般编程语言的函数中的参数是值的传递,你传进的数据就是局部的,做完一系列运算后得到的结果必须返回才行,否则函数运行完了就什么都不剩了

而SAS宏是文本原样的传递,你传进去的看似一个数据集,其实只是这个数据集的名字,你在宏里做的一系列操作,其实就是对这个数据集进行了操作,宏运行完之后,这个数据集也就发生变化了。另外只有宏变量有全局和局部的区分,其他的数据集什么的就没有了。所以SAS的宏一般是不搞什么返回值的。只不过还是有个例外,如果你非要返回一个值,并且可以用a=%macro()这样的方式把返回值赋给变量a,那么可以用我下面的方法,即宏的最后一行写上你要返回的值,且不加最后的分号。我下面给的程序应该可以满足你的要求了,只不过一般写SAS宏不这么折腾

%macro a(a);
    &a
%mend a;

%macro b(b);
  %put >>%a(a=&b)<<;
%mend b;

%b(b=Get It Out);

%put >>%a(a=It also works)<<;
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
Tigflanker + 1 + 1 + 1 谢谢。

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

playmore邀请您访问ChinaTeX论坛!!!进入ChinaTeX论坛

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-10 22:38