为什么proc在SAS宏中写入时不需要%符号

为什么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的核心

我有一个关于SAS宏的基本问题。在sas宏中,当您编写let语句、put语句或if语句时,总是在其前面加上%作为前缀

但是,当您在宏中编写“proc”时,为什么不需要编写%proc呢?
或者,例如%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宏处理器的命令一样