簡體   English   中英

SAS語言提供的宏編程有什么好處?

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

在SAS中,整個“宏觀”概念的效用到底是什么? 我的意思是,編寫可以轉換為程序的東西與編寫可以直接編譯並運行的程序有何不同?

我只有JAVA的經驗,我不認為JAVA允許宏或元編程。 因此,我想知道宏編程的意義是什么。 不能僅僅封裝一些業務邏輯,因為為此我們使用函數/方法/子例程等。

tl; dr回答

SAS Macro或通常使用文本預處理器的實用程序,是要支持直接用生成的語言編寫會很麻煩的構造。

細節

SAS Macro是文本預處理器。 它的作用類似於C / C ++中的CPP。 幾個Unix實用程序中的M4; HTML中基於Python和Ruby的模板語言; 等等。文本預處理器有兩個主要目的:

  1. 通過提供數據驅動的模板機制來最大程度地減少冗余代碼

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

典型工作流缺少文本處理器的語言依賴於字符串操作來支持動態代碼生成和執行。 在Java中,動態生成尤其困難

幾種SAS語言都有CALL EXECUTE語句,但是隨着時間的流逝,用戶更喜歡使用SAS Macro。 用戶之所以依賴SAS Macro,部分原因是它是一種非常出色的文本處理器。 與大多數其他文本處理器不同,它支持流控制,范圍,函數定義,算術,調用庫函數,注釋,交互式輸入,並且具有(當然,對於預處理器而言)不引人注目的語法。

因為它可能太好了,所以用戶更喜歡使用SAS宏,在這種宏中,面向對象的方法(即使用PROC DS2或更近期的PROC GROOVYPROC LUA )會導致代碼更具可維護性。 經常添加新的語言和訪問SAS的新方法,但是由於SAS有太多的用戶寫了鏈接到舊文檔的頁面,因此有時PageRank的追趕速度可能會很慢。 因此人們最終會過度使用Macro。

在我的工作流程中,我搜索最適合手頭任務的SAS語言或PROC,然后以該語言執行大部分處理。 但是,每天都有一個用例,其中Macro使事情比其他任何事情都要簡單。 在那種情況下,我使用宏。 如果您首先遵循生成語言的原則,然后再遵循宏的原則,那么我認為您會發現宏是一種寶貴的工具。

Java支持面向對象的編程范例。 這使您可以使用類,方法等來控制程序流程並實現與基本編程結構等效的功能,例如循環,if-then邏輯等。

我不確定100%是否為SAS使用的編程范例指定了什么名稱,我想我稱其為順序語言,因為代碼一次只是從上至下執行1條語句。

這意味着在SAS語言中,宏之外,沒有語言的任何部分允許您實現大多數語言理所當然的控制結構。 它沒有“過程”的概念(通常在該詞的編程意義上使用)。 SAS一次只執行從上至下一個語句的代碼。

SAS中宏代碼的用途(如我所見)是:

  • 使程序由數據驅動
  • 將proc包裝在控制結構中(例如,有條件地執行某些代碼段,在循環中執行代碼段等)
  • 生成未知的預執行所需的代碼

一些示例是:

  • 僅當某個表已存在時才運行數據步驟
  • 在100個不同的表上運行proc freq語句(與復制/粘貼100個單獨的proc freq語句並在數據更改時對其進行維護相反)
  • 生成一個我不知道執行前時間的數字或單詞,因為這些值可以簡單地替換為代碼

宏可以使我們的生活更輕松,但這要付出一定的代價。 宏代碼很難讀/寫/調試,因此,如果有非宏驅動的解決方案可用,通常應避免使用。

SAS宏語言的主要目的是成為SAS代碼生成器。 SAS宏通常會生成SAS CODE(可能是很多數據步驟和proc步驟或一條語句的一部分)。 通常,生成SAS代碼而不是鍵入(或復制粘貼)很有用(減少鍵入)。 人們確實將宏用於函數和子例程。

就是說,如果您不熟悉SAS,我建議您現在不要學習宏語言。 在學習宏語言以生成SAS代碼之前,先學習SAS語言更有意義。 許多經驗豐富的SAS程序員完全避免使用宏語言。

我將嘗試解決問題的這一部分:

編寫可以轉換為程序的東西與編寫可以直接編譯並立即運行的程序有何不同?

  • 宏允許在宏語言之外很難實現的條件執行。
  • 宏允許循環和迭代控制-我不想寫相同的代碼100次。
  • 宏為通用代碼提供了一種方法,可以將其視為Java或其他語言中的例程。

盡管SAS具有功能,但我不認為它具有子例程和方法,這是宏語言要填補的空白的一部分。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM