求开解。
看到这一块时感觉好烦呀,困惑有如当年刚见识指针的指针一般。
好吧,我能理解,每个处理普通字符的宏函数都有一个对应处理特殊字符的宏函数,有如%UPCASE之于%QUPCASE。后者的作用就是能无视&和%这两个特殊解析宏的字符,看见&a不会去解析a, 而是直接当'&a'来处理。
但当书上这个例子一抛出,楼主便陷入了懵逼中。
%let a=begin;
%let b=%nrstr(&a);
%put UPCASE produces: %upcase(&b);
%put QUPCASE produces: %qupcase(&b);
嵌套的宏解析...
一点点来捋吧。首先,带%的函数一定是跟宏相关,要能解析括号里带&的宏字符参数,将宏替换为相应的值,再以对应的普通函数处理。所以这样理解的话,%UPCASE相当于专门处理宏参数的UPCASE函数。
在这个例子里,宏a对应的值解析为begin, 宏b的赋值因为无视&的存在,所以解析为&a。
那么,%UPCASE(&b)上来先对&b做解析,得到&a, 然后下一步呢?
是函数变成了UPCASE(&a), 还是UPCASE(begin)?
无论是哪个分支,都不大像能得出结果为小写的begin啊。
SAS运行结果如下:
1 %let a=begin;
2 %let b=%nrstr(&a);
3 %put UPCASE produces: %upcase(&b);
UPCASE produces: begin
4 %put QUPCASE produces: %qupcase(&b);
QUPCASE produces: &A
QUPCASE我大概能蒙对,因为不再对&a做进一步解析,所以会得出&A.
如果这里没搞懂,后头整个人都会不好了。因为下面还有一大坨%SUBSTR, %SCAN, %INDEX以及对应的特殊字符分身,可以想象这里头能埋伏多少变形海量题目来搞你,简直生无可恋。
顺带说一下,如果把代码从参数&b改为&a,去掉一层嵌套解析后,结果是这样的:
5 %let a=begin;
6 %let b=%nrstr(&a);
7 %put UPCASE produces: %upcase(&a);
UPCASE produces: BEGIN
8 %put QUPCASE produces: %qupcase(&a);
QUPCASE produces: BEGIN