zoukankan      html  css  js  c++  java
  • 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的环境中运行的。因此,创建的宏变量是全局的宏变量

  • 相关阅读:
    HDU1251 字典树 这题亮点在于是我自己写的字典树
    POJ3253 哈夫曼树+小根堆 【自己实现】
    poj3083 深搜
    用c语言的感觉
    poj1321 深搜
    POJ 2488 深搜
    HDU2037 今年暑假不AC 贪心
    hdu1247 Hat’s Words 字符串模拟
    Thrift框架具体使用
    如何使用Rose将类图转化为java代码
  • 原文地址:https://www.cnblogs.com/abble/p/11269477.html
Copyright © 2011-2022 走看看