SAS 语言提供的宏编程有什么好处?

What is the benefit of macro programming as offered by the SAS language?

在 SAS 中,整个 'macro' 概念的实用性到底是什么?我的意思是,与编写可以编译并立即 运行 的程序相比,编写将被转换为程序的程序有什么意义?

我只有 JAVA 的经验,我认为 JAVA 不允许宏或元编程。因此我想知道宏编程的意义是什么。它不能只是封装一些业务逻辑,因为为此我们使用 functions/methods/subroutines 等

SAS 宏语言的主要目的是成为 SAS 代码生成器。 SAS 宏通常会生成 SAS 代码(可能是很多数据步骤和过程步骤或一个语句的一部分)。生成 SAS 代码而不是键入(或复制粘贴)通常更有用(更少键入)。人们确实将宏用于函数和子例程。

也就是说,如果你是SAS的新手,我建议你现在不要学习宏语言。在学习宏语言生成SAS代码之前,先学好SAS语言更有意义。许多有经验的 SAS 程序员完全避免使用宏语言。

我将尝试解决这部分问题:

What is the point of writing something that will be converted to a program as opposed to writing a program that can be compiled and run straight away?

  • 宏允许条件执行,这不容易实现 在宏语言之外。
  • 宏允许循环和迭代 control - 我不想将相同的代码写 100 次。
  • 宏为通用代码提供了一种方法,可以将其视为 Java 或其他语言中的例程。

虽然 SAS 有函数,但我认为它没有子程序和方法,这是宏语言旨在填补的部分空白。

Java 支持面向对象的编程范式。这允许您使用类、方法等来控制程序流程并实现与循环、if-then 逻辑等基本编程结构等价的...

我不是 100% 确定为 SAS 使用的编程范式指定了什么名称,我想我会称它为顺序语言,因为代码只是从上到下一次执行 1 个语句.

这意味着在 SAS 语言中,除了宏之外,没有语言的任何部分可以让您实现大多数语言认为理所当然的控制结构。它没有 'procedure' 的概念(在这个词的一般编程意义上使用)。 SAS 只是一次从上到下一条语句执行代码。

SAS 中宏代码的用途(如我所见)是:

  • 使程序数据驱动
  • 将 proc 包装在控制结构中(即有条件地执行某些代码,在循环中执行代码段等)
  • 正在生成执行前未知的所需代码

一些例子是:

  • 运行 一个数据步,仅当某个 table 已经存在时
  • 运行 超过 100 个不同 table 的 proc freq 语句(相对于 copy/pasting 100 个单独的 proc freq 语句并在数据更改时维护它们)
  • 生成一个我不知道预执行时间的数字或单词,因为这些值可以简单地代入代码

宏可以让我们的生活更轻松,但这是有代价的。宏代码更难read/write/debug,如果有可用的非宏驱动解决方案,通常应该避免使用。

tl;博士回答

SAS 宏的实用程序,或者 text preprocessor 的一般实用程序, 是为了支持编写起来很麻烦的结构 直接使用生成的语言。

详情

SAS 宏是一个文本预处理器。它的作用类似于 C/C++ 中的 CPP;几个 Unix 实用程序中的 M4; HTML 中基于 Python 和 Ruby 的模板语言;等文本预处理器有两个主要目的:

  1. 通过提供数据驱动的模板机制来最小化冗余代码

  2. 超越生成语言语法的限制

典型工作流程缺少文本处理器的语言依赖于字符串操作来支持动态代码生成和执行。动态生成为especially difficult in Java

多种 SAS 语言都有 CALL EXECUTE 语句,但随着时间的推移,用户更喜欢使用 SAS 宏。 用户依赖 SAS Macro 的部分原因是它是一个非常好的文本处理器。与大多数其他文本处理器不同,它支持流控制、范围、函数定义、算术、调用库函数、注释、交互式输入,并且具有(对于预处理器而言,当然)不显眼的语法。

因为它可能太好了,用户更喜欢 SAS 宏,其中面向对象的方法(即,使用 PROC DS2, or more recently PROC GROOVY or PROC LUA)会导致更易于维护的代码。经常添加新语言和访问 SAS 的新方法,但由于 SAS 有很多用户编写了链接到旧文档的页面,有时 PageRank 可能会很慢。所以人们最终会过度使用 Macro。

在我的工作流程中,我会搜索最适合手头任务的 SAS 语言或 PROC,并使用该语言执行大部分处理。然而,每一天都有一个用例,其中宏使事情比其他任何事情都简单。在那些情况下,我使用宏。如果您首先遵循生成语言的原则,其次是宏,我想您会发现宏是一个非常宝贵的工具。