SAS学习笔记46 宏变量的可使用范围
全局宏变量
在宏程序内部,除了使用%GLOBAL语句创建。在某些情况下,还可以直接使用DATA步中的CALL SYMPUT创建。
在一个宏程序中,在包含CALL SYMPUT的DATA步程序之前,如果没有局部宏变量存在(即SAS系统还没有为该宏创建Local Symbol Table),那么该CALL SYMPUT创建的宏变量为全局的宏变量(注:%LET语句和INTO子句无此功能)。即使在DATA步之后有了局部的宏变量(有了Local Symbol Table),CALL SYMPUT创建的宏变量仍然是全局的
如果该宏程序是带参数的宏程序,或者在DATA步之前使用%LOCAL语句(或者%LET语句,或者INTO子句)创建了局部宏变量,那么SAS系统会为该宏程序创建一个Local Symbol Table;所以CALL SYMPUT创建的宏变量会存储在Local Symbol Table中,也就是会变成局部宏变量
因此,CALL SYMPUT创建的宏变量究竟是全局的,还是局部的,要看该DATA步所在的环境。如果在该DATA步执行时,无Local Symbol Table,那么创建的宏变量就为全局的;反之,就是局部的宏变量
特别奇葩的情况
CALL SYMPUT除以上情况下可创建全局宏变量外,还有一种比较奇葩的情况。即使在DATA步之前有Local Symbol Table,CALL SYMPUT创建的宏变量仍旧是全局的
在CREATE_GLOBAL宏程序中的DATA步是不完整的,没有RUN语句。导致在宏运行后,DATA步并没有执行(因此没有创建宏变量GL_VAR,这也是为什么在CREATE_GLOBAL宏内部无法输出GL_VAR的值)。
紧接着,在后面的OPEN CODE中遇到RUN语句,然后才执行该DATA步,实际上该DATA步是在OPEN CODE的环境中运行的。因此,创建的宏变量是全局的宏变量
SAS学习笔记46 宏变量的可使用范围的更多相关文章
- SAS学习笔记41 宏变量存储及间接引用
Macro Variables存储在“Symbol Table”中.它是由Macro Processor在SAS启动时自动创建并维护的.SAS提供了一张视图来供我们查看Symbol Table中的内容 ...
- SAS学习笔记10 宏变量
一个宏变量存放的值保持不变直到被修改(全局变量) 引用时,变量名前加上"&" 宏变量在引用时放在双引号之间会被解读(单引号不会被解读) 用户定义的宏变量,有三种方式: %l ...
- SAS学习笔记44 宏函数
类SAS函数的宏函数 该部分函数共5个,其无论是名字.语法.功能都与SAS函数类似,只是在函数名前多了一个“%”.这5个宏函数分别是: %INDEX %LENGTH %SCAN %SUBSTR %UP ...
- SAS学习笔记43 宏语句
流程控制 %GOTO语句与%label语句是结合起来使用的.首先通过%label语句定义一个位置,使用%GOTO语句可直接将程序的执行位置跳到该label标记位置,达到控制程序执行顺序的目的.可实现与 ...
- SAS学习笔记37 宏程序中parmbuff选项
该选项用于指定宏可以接受可变参数列表,而且参数值保存在SYSPBUFF宏变量中.parmbuff的参数价值,其实就是每次执行宏程序时,可以指定不同数量的参数值,这些宏参数被保存在&syspbu ...
- SAS学习笔记42 宏程序
Autocall Macro是由SAS提供的一些实现特定功能的Macro Program,可以在代码中直接使用 其中以Q开头的相比正常的多了隐藏特殊字符的功能(称之为Macro Quoting): K ...
- SAS学习笔记之《SAS编程与数据挖掘商业案例》(3)变量操作、观测值操作、SAS数据集管理
SAS学习笔记之<SAS编程与数据挖掘商业案例>(3)变量操作.观测值操作.SAS数据集管理 1. SAS变量操作的常用语句 ASSIGNMENT 创建或修改变量 SUM 累加变量或表达式 ...
- SAS学习笔记之《SAS编程与数据挖掘商业案例》(5)SAS宏语言、SQL过程
SAS学习笔记之<SAS编程与数据挖掘商业案例>(5)SAS宏语言.SQL过程 1. 一个SAS程序可能包含一个或几个语言成分: DATA步或PROC步 全程语句 SAS组件语言(SCL) ...
- SAS学习笔记之《SAS编程与数据挖掘商业案例》(4)DATA步循环与控制、常用全程语句、输出控制
SAS学习笔记之<SAS编程与数据挖掘商业案例>(4)DATA步循环与控制.常用全程语句.输出控制 1. 各种循环与控制 DO组 创建一个执行语句块 DO循环 根据下标变量重复执行DO和E ...
随机推荐
- ICEM-缺角正方体(拓块)
原视频下载地址:https://yunpan.cn/cqFIqQWrNqzNc 访问密码 6fb4
- Java核心复习——CompletableFuture
介绍 JDK1.8引入CompletableFuture类. 使用方法 public class CompletableFutureTest { private static ExecutorServ ...
- TynSerial结构体序列(还原)
TynSerial结构体序列(还原) 1)定义一个结构体 type TRec = record id, name: string; end; 2)结构体序列(还原) procedure TForm1. ...
- ST (Sparse Table:稀疏表)算法
1541:[例 1]数列区间最大值 时间限制: 1000 ms 内存限制: 524288 KB提交数: 600 通过数: 207 [题目描述] 输入一串数字,给你 MM 个询问 ...
- Celery如何修复Python的GIL问题
小结: 1. Celery如何修复Python的GIL问题https://python.freelycode.com/contribution/detail/346 最近,我重读了Glyph写的Uny ...
- WhereHows编译时报错EINVRES Request to https://bower.herokuapp.com/packages/ace-builds failed with 502
先说明一下,简单点讲就是bower的仓库地址换掉了.解决方案如下: 在.bowerrc文件中增加这么一句: { "registry": "https://registry ...
- SQL语言Select经典语句
-- 示例数据 Select * From Employee Select * From Department -- 返回工资最高的员工的信息 Select * From Employee where ...
- 自己发挥的内容 有关ViewModel的一句翻译(难点expecting)
- Qt编写自定义控件46-树状导航栏
一.前言 树状导航栏控件是所有控件中最牛逼最经典最厉害的一个,在很多购买者中,使用频率也是最高,因为该导航控件集合了非常多的展示效果,比如左侧图标+右侧箭头+元素前面的图标设置+各种颜色设置等,全部涵 ...
- JavaScript正则表达式补充
定义正则表达式 /.../用于定义正则表达式 /.../g表示全局匹配 /.../i表示不区分大小写 /.../m表示多行匹配 JS正则匹配时本身就是支持多行,此处多行匹配只是影响正则表达式^和$,m ...