美文网首页
257:macro base(五)---宏参数

257:macro base(五)---宏参数

作者: 林芷文的日常碎碎念 | 来源:发表于2023-07-31 17:21 被阅读0次

宏参数被用来传递传递值或者文本字符串给宏,能让你不用%let就能定义宏变量。

宏参数有两种类型:一种是positional parameter,另一种是keyword(named) parameter。

一:位置参数(positional parameter)

位置参数的名称来源于这样一个事实:即它们是使用%Macro语句上的特定位置来定义的。当调用宏时,该值将通过宏调用中与宏定义中相同的对应位置传递.位置参数比关键词参数有一点点好处,只是少一点点内存。

%macro look(dsn,obs);
title "data set &dsn";
proc contents data=&dsn;
run;
title2 "first &obs observations";
proc print data=&dsn (obs=&obs);
run;
%mend look;

在调用带有参数的宏时,在宏名称后面是一个用逗号分隔的参数值列表,这些参数值由圆括号括起来。

比如下面这样

%look(sashelp.cars,10)

你不必给所有的位置参数一个值,比如下面这样,但是不一定会产生可用的代码
%look() ---报错
%look(sashelp.cars) ---报错

%look(,10)---报错

比如我们调用这个%look(,10),对于为空的参数,SAS会解析成空字符串(null string),所以%look(,10)会解析成

title "data set ";
proc contents data=;
run;
title2 "first 10 observations";
proc print data= (obs=10);
run;
这段程序包含语法错误,所以肯定会报错,也不会运行。

二:关键词参数(keyword parameter)

关键词参数可以用在任何位置,也可以设置默认的值。形式是有一个等于号。
%macro look(dsn=,obs=);
title "data set &dsn";
proc contents data=&dsn;
run;
title2 "first &obs observations";
proc print data=&dsn (obs=&obs);
run;
%mend look;

%look(obs=10,dsn=sashelp.cars)

注意到在宏里面是我是把宏参数dsn放在前面,但是调用的时候我给他们换了一下位置,这样是不会报错的,但是还是建议按顺序来。

如果你需要多次调用一个宏,且某个宏参数的值不变的话,你可以直接在宏里面提前把值写上,比如这样:

%macro look(dsn=sashelp.cars,obs=);
title "data set &dsn";
proc contents data=&dsn;
run;
title2 "first &obs observations";
proc print data=&dsn (obs=&obs);
run;
%mend look;

%look(obs=10)
%look(obs=15)
%look(obs=20)
%look(dsn=sashelp.class,obs=5);/这时候会替换成class数据集/

需要注意的是,如果你的位置参数和关键词参数用法混用的话,要严格按照所列的顺序赋值,下面这段程序肯定会报错

%macro look(dsn,obs=);
title "data set &dsn";
proc contents data=&dsn;
run;
title2 "first &obs observations";
proc print data=&dsn (obs=&obs);
run;
%mend look;

%look(obs=10,sashelp.cars)

上面就是关于宏参数需要注意的一些点,当然还有一些好的编程习惯,假设你的宏里面宏参数有很多个:

1)将横向结构转换成纵向结构
2)参数能简要描述输入的内容
3)当多次调用宏都是用默认值的时候,可以把默认值放到宏参数中
4)对每一个参数最好有对应的注释。

%look(dsn=,

        var1=Y,

        var2=,

        var3=N,

        obs=,

        dsout=);

/******************************************
dsn:输入数据集

var1:XXXXXXXXXXX;

var2:XXXXXXXXXXX;

var3:XXXXXXXXXXX;

obs:XXXXXXXXXXX;

dsout:输出数据集;

*******************************************/

相关文章

  • 模板宏

    声明宏 {% macro 宏的名字(参数) %}​内容{% endmacro %} 调用宏 {{ 宏的名字(参数...

  • 数据分析师-Week16

    1.调用rar解压.rar 2.在宏(macro)中高亮显示关键字 3.用宏macro处理参数并返回结果

  • 宏(Macro)指的是 Rust 中一系列的功能 声明(Declarative)宏, 使用macro_rules!...

  • CPP常识 04 -- 宏,#号##号,可变参数

    文章来自于这里:c语言中的宏,#号##号,可变参数 C(和C++)中的宏(Macro)属于编译器预处理的范畴,属于...

  • JS事件循环机制之宏任务/微任务

    宏任务(macro-task)macro-task.png 微任务(micro-task)micro-task.p...

  • freemarker宏 macro , nested , 函数

    macro可以理解为一个函数,根据输入的参数来生成结果 定义macro 这种XXX...的参数,会接收其他剩余参数...

  • 宏指令(Macro)

    人类宇宙,克莱因瓶 衡宇宙,克莱因瓶 量子计算机,瓶塞 瓶外,无限 无限侵入有限时空, 所以我们将历经无数种可能 ...

  • this.$nextTick的那些事

    宏任务macro task: setTimeout、MessageChannel、postMessage、setI...

  • 191:macro base(一)

    最近真的感觉身心疲惫,一方面感觉来自公司不断增加的压力,这个就不多说了;另一方面就是各个项目的不断切换和单个项目的...

  • iOS基础-宏定义

    宏定义 Macros A macro is a fragment of code which has been g...

网友评论

    本文标题:257:macro base(五)---宏参数

    本文链接:https://www.haomeiwen.com/subject/fggepdtx.html