为什么proc在SAS宏中写入时不需要%符号
我有一个关于SAS宏的基本问题。在sas宏中,当您编写let语句、put语句或if语句时,总是在其前面加上%作为前缀 但是,当您在宏中编写“proc”时,为什么不需要编写%proc呢?为什么proc在SAS宏中写入时不需要%符号,sas,sas-macro,c,r,Sas,Sas Macro,C,R,我有一个关于SAS宏的基本问题。在sas宏中,当您编写let语句、put语句或if语句时,总是在其前面加上%作为前缀 但是,当您在宏中编写“proc”时,为什么不需要编写%proc呢? 或者,例如%data?%表示宏语法-宏函数、宏语句或宏命令。基本上,这本书涵盖的内容 当您在宏中有一个proc时,您要求宏做的是在堆栈中键入该proc,就像键入它一样。您不需要%,因为proc是您要求键入的文本,而不是宏语言解释器本身的命令 SAS宏语言和SAS Base是两种本质上独立的语言,后者是SAS的核心
或者,例如%data?
%
表示宏语法-宏函数、宏语句或宏命令。基本上,这本书涵盖的内容
当您在宏中有一个proc时,您要求宏做的是在堆栈中键入该proc,就像键入它一样。您不需要%
,因为proc是您要求键入的文本,而不是宏语言解释器本身的命令
SAS宏语言和SAS Base是两种本质上独立的语言,后者是SAS的核心,前者是一种帮助器,可以更轻松地完成某些重复的工作。它们只是松散地集成在一起
%let
或%put
是宏语句:它们与可在数据步骤中使用的put
不同。它们共享功能的名称和基本思想,但除了中的printf
和中的printf
之外,没有其他东西是相同的。因为数据步语言和宏语言是两种不同的编程环境。当SAS标记您的语句时,它会查找特定的关键字。其中一个关键字是%
触发器。在运行任何操作之前,word scanner将宏语句从SAS语句中分离出来,并将它们传递给相应的处理器。宏语句总是在SAS语句之前编译和解析
使用宏时,将文本字符串存储在某个宏变量或宏程序中。就SAS而言,宏变量或程序内部的任何内容都是原始文本
考虑以下两个宏:
宏1:
%macro foo1;
data bar1;
var1 = 'a';
var2 = 'b';
var3 = 'c';
var4 = 'd';
keep var1-var3;
run;
%mend;
宏2:
%macro foo2;
keep
%do i = 1 %to 3;
var&i
%end;
%mend;
data bar2;
var1 = 'a';
var2 = 'b';
var3 = 'c';
var4 = 'd';
%foo2;
run;
编译宏1时,在调用它之前不会发生任何事情。这是因为您已将所有文本存储在宏程序中。调用宏语句时:
%foo1;
SAS将短语foo1
传递给宏处理器,程序运行,解析文本被吐回word scanner,然后word scanner逐个处理各个令牌。就SAS而言,它可以准确地看到其中包含的数据步骤:
data bar1;
var1 = 'a';
var2 = 'b';
var3 = 'c';
var4 = 'd';
keep var1-var3;
run;
当我们运行宏2时,我们将得到完全相同的输出,但执行方式不同
在编译宏foo2
时,我们还存储了一些有关内部宏循环的信息。这个特定的循环只是按顺序创建文本“var1 var2 var3”。请注意,循环前面有一段文字:“keep”。这是完全有效的,因为它只是一段文字
我们在数据步骤内部执行宏。当我们开始数据步骤的编译过程时,单词扫描程序会找到宏触发器%
,并将该信息传递给宏处理器。当它发现foo2
是有效的编译宏时,宏处理器运行宏程序,生成的文本被发送到word扫描仪:
keep
var1
var2
var3
我们故意用分号结束对宏的调用。这会告诉单词扫描程序我们在一条语句的末尾,该语句最终会被发送到编译器
宏完成后,word scanner将继续执行,将语句传递到输入堆栈,直到到达run
边界或另一个proc
步骤
我们可以在数据步骤之外调用foo2
,但是SAS会出错,说它们不是有效的语句。它相当于键入keepvar1var2var3代码>在线上并尝试运行它。这段特定的文本只在数据步骤中有用,尽管SAS会乐意尝试在任何您想要的地方运行它
SAS看不到宏。它只理解数据步骤和过程语言。只有宏处理器才能看到并使用宏触发器。单词扫描程序防止编译器看到任何宏触发器。把单词扫描器想象成一个特殊的过滤器:它只把文本分发到可以阅读的地方
有一些例外情况,数据步骤中的某些函数可以弥合SAS和宏之间的差距,但实际上与此无关。出于同样的原因,在编辑HTML时,我不必在网页中的单词周围键入
。我的网页中的文字不是HTML命令,就像SAS代码语句不是SAS宏处理器的命令一样