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

时间:2015-08-31 19:25:49

标签: java macros sas

在SAS中,整个'宏的实用性到底是什么?概念?我的意思是,编写一些可以转换为程序的东西,而不是编写一个可以编译并立即运行的程序,这有什么意义呢?

我只有JAVA的经验,我不认为JAVA允许宏编程或元编程。因此我想知道宏编程的重点是什么。它不仅可以封装一些业务逻辑,因为我们使用函数/方法/子例程等。

4 个答案:

答案 0 :(得分:3)

tl;博士答案

SAS Macro的实用程序,或一般text preprocessor的实用程序, 是支持编写繁琐的结构 直接用生成的语言。

详细

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

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

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

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

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

    因为它可能太好了,所以用户更喜欢SAS宏,其中面向对象的方法(即使用PROC DS2,或者最近PROC GROOVYPROC LUA)会带来更多可维护的代码。经常添加新语言和访问SAS的新方法,但由于SAS有很多用户将书面页面链接到旧文档,因此有时候PageRank可能会很慢。所以人们最终过度使用Macro。

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

答案 1 :(得分:1)

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

我不是100%确定SAS使用的编程范例已经分配了什么名称,我想我称之为顺序语言,因为代码一次只能从上到下1个语句执行。

这意味着在SAS语言中,在宏之外,没有任何语言可以让您实现大多数语言理所当然的控制结构。它没有“过程”的概念(用于该词的一般编程意义)。 SAS一次只执行从顶部到底部的一个语句的代码。

SAS中宏代码的使用(我认为)是:

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

一些例子是:

  • 运行datastep,仅当某个表已存在时
  • 在100个不同的表上运行proc freq语句(而不是复制/粘贴100个单独的proc freq语句并将其保留为数据更改)
  • 生成一个我不碰巧知道执行前时间的单个数字或单词,因为这些值可以简单地代入代码中

宏可以让我们的生活更轻松,但需要付出代价。宏代码更难以读/写/调试,如果有非宏驱动的解决方案,通常应该避免使用宏代码。

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

  

编写将转换为程序的内容有什么意义,而不是编写可以编译并立即运行的程序?

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

虽然SAS具有功能,但我认为它没有子程序和方法,这是宏语言要填补的空白的一部分。