概述 (DEFINE-!ENDDEFINE 命令)
DEFINE—!ENDDEFINE 定义程序宏,然后可以在命令序列中使用该程序宏。 一个宏在几个不同的上下文中很有用。 例如,它可用于:
- 使用循环构造而不是冗余规范,重复发出一系列相同或类似的命令。
- 指定一组变量。
- 使用单个命令生成来自多个程序过程的输出。
- 创建随后可执行的复杂输入程序,过程规范或整个会话。
通过指定有效命令的任何部分并为其提供宏名称来定义宏。 然后在命令序列中的宏调用中指定此名称。 当程序迂到宏名称时,它会扩展宏。
在整个此引用中的宏定义示例中,宏名称,主体和自变量以小写形式显示,以实现可读性。 宏关键字 (始终以惊叹号 (!) 开头) 以大写显示。
选项
宏自变量。 您可以在宏定义中声明和使用自变量,然后在宏调用中为这些自变量指定特定值。 您可以为自变量定义缺省值,并指示在调用宏时是否应该扩展自变量。 请参阅主题 宏自变量 (DEFINE-!ENDDEFINE 命令) 以获取更多信息。
宏伪指令。 您可以打开和关闭宏扩展。 请参阅主题 宏伪指令 (DEFINE-!ENDDEFINE 命令) 以获取更多信息。
字符串处理函数。 您可以处理一个或多个字符串,并生成新的字符串或数字结果的字符表示。 请参阅主题 字符串处理函数 (DEFINE-!ENDDEFINE 命令) 以获取更多信息。
条件处理。 您可以构建条件构造和循环构造。 请参阅主题 条件处理 (DEFINE-!ENDDEFINE 命令) 以获取更多信息。
宏变量。 您可以直接为宏变量赋值。请参阅主题 宏变量的直接赋值 (DEFINE-!ENDDEFINE 命令) 以获取更多信息。
基本规范
所有宏都必须以 DEFINE 开头并以 !ENDDEFINE结尾。 这些命令标识宏定义的开始和结束,并用于将宏定义与命令序列的其余部分分开。
- 紧跟在
DEFINE之后,指定 宏名称。 所有宏都必须具有名称。 在宏调用中使用该名称来引用宏。 宏名称可以以惊叹号 (!) 开头,但除此之外,请遵循通常的命名约定。 以! 开头名称 确保它不会与会话中的其他文本或变量冲突。 - 紧跟在宏名称之后,在括号中指定可选的 参数 定义。 此规范指示调用宏时将读取的参数。 如果不想包含自变量,请仅指定括号; 无论括号是否包含自变量,都是必需的。
- 接下来指定宏的主体。 宏主体 可以包括命令,命令部分或宏语句 (宏伪指令,字符串操作语句以及循环和条件处理语句)。
- 在宏主体的末尾,指定
!ENDDEFINE。
要调用宏,请在命令序列中发出 宏调用 。 要调用宏,请指定宏名称和任何必需的参数。 如果没有参数,那么只需要宏名称。
操作
- 当程序读取宏定义时,它会将未括在引号中的所有文本 (自变量除外) 转换为大写。 参数以大写和小写形式读取。
- 宏工具不会构建和执行命令; 相反,它会在名为 宏扩展的进程中扩展字符串。 宏调用启动宏扩展。 在扩展字符串之后,包含扩展字符串的命令 (或部分命令) 将作为命令序列的一部分执行。
- 宏调用上未在宏扩展中使用的任何元素都将被读取并与扩展字符串组合。
- 扩展字符串和宏调用中的其余元素 (如果有) 必须符合程序的语法规则。 如果没有,那么程序将根据语法问题的性质生成警告或错误消息。
语法规则
就像其他命令一样,扩展宏必须遵循运行它们的处理方式的规则。 虽然创建将以交互方式和批处理方式运行的宏语法是可取的,但这有时可能会增加您可能想要避免的复杂性层。 因此,我们建议您编写遵循交互式语法规则的宏语法,并构造作业以在交互式语法规则下执行宏语法。
DEFINE和!ENDDEFINE必须拼写完整。 它们不能缩写。- 宏
!ENDDEFINE语句应该以句点结束。 句点作为行上的最后一个字符在交互方式下被解释为命令终止符。 - 其他宏语句 (例如,
!IF,!LOOP和!LET) 不应以句点结束。 - 宏主体中表示将在扩展宏时生成的命令的文本应包含每个命令末尾的句点,每个命令应在新行上开始。
宏主体不能包含字符 \ 或 ^ ,除非它们包含在括在引号内的字符串中,如 "a valid
backslash \ in a quoted string"中所示。
示例
DEFINE !macro1(type = !DEFAULT(1) !TOKENS(1)
/varlist=!CMDEND)
!IF (!type = 1)!THEN
frequencies variables=!varlist.
!ELSE
descriptives variables=!varlist.
!IFEND
!ENDDEFINE.
- 宏语句
DEFINE,!IF,!ELSE和!IFEND不以句点结尾。 !ENDDEFINE以句点结束。- 宏生成的
FREQUENCIES和DESCRIPTIVES命令分别以新行开始并以句点结束。
要构造命令语法作业,以便始终使用交互式处理规则而不是批处理规则:
- 使用
INSERT而不是INCLUDE将包含宏的命令文件与其他命令文件组合在一起。 请参阅主题 INSERT 以获取更多信息。 - 在生产设施作业中,选择 交互式 作为语法输入格式。 请参阅主题 生产作业 以获取更多信息。
- 在批处理工具 (仅适用于 IBM® SPSS® Statistics Server) 中,使用 -i 开关以使用交互式处理规则。
兼容性
对宏功能的改进可能会导致以前正常运行的作业发生错误。 具体而言,对于以交互规则处理的语法,如果在命令末尾调用宏,且没有命令终止符(句点或空行),则宏展开之后的下一个命令将被解释为延续行,而不是新命令,如:
DEFINE !macro1()
var1 var2 var3
!ENDDEFINE.
FREQUENCIES VARIABLES = !macro1
DESCRIPTIVES VARIABLES = !macro1.
在交互模式中,DESCRIPTIVES 命令将被解释为 FREQUENCIES 命令的延续,且这两个命令都不会运行。
限制
- 宏中不允许使用
BEGIN DATA—END DATA命令。 - 宏中不支持
BEGIN PROGRAM-END PROGRAM命令。 - 宏中不允许使用
DEFINE命令。