SAS: استدعاء ماكرو واحد من آخر ... ترتيب تعريفات الماكرو

StackOverflow https://stackoverflow.com/questions/537283

  •  22-08-2019
  •  | 
  •  

سؤال

في التعليمات البرمجية لدي العديد من وحدات الماكرو. ماكرو A هو ماكرو الرئيسي. ماكرو ثم يستدعي الماكرو B الذي يستدعي بدوره الماكرو C.

في SAS، هل يجب علي تحديدها في النظام الخلفي؟ بمعنى آخر، هل يجب علي تحديد ماكرو C أولا، ثم ماكرو ب، ثم ماكرو آخر؟ أو هل يهم الأمر نظرا لأن SAS يقرأ كل الكود قبل أن يضرب الأمر في الواقع الأمر لتشغيل وحدات الماكرو؟ بالنسبة لهذه المسألة، هل يمكنني إصدار الأمر لتشغيل الماكرو كبيان الأول في التعليمات البرمجية ثم حدد وحدات الماكرو الموجودة أسفل الأمر؟

شكرا!

هل كانت مفيدة؟

المحلول

أولا، يجب عليك تحديد ماكرو قبل أن يسمى.

ثانيا، لا يهم المكان الذي يتم الاحتجاج به الماكرو طالما قمت بتحميله مسبقا.

لتوضيح مشكلتك: مكتبة AutoCall هي صديقك. إذا لم يسمح لك مسؤول SAS بوضع وحدات الماكرو في مكتبة AutoCall، فيمكنك إلحاق AutoCall مثل ذلك:

filename mymacros 'c:\mysas'; 
/*this defines the directory you have stored your macros*/

options sasautos=(sasautos mymacros) mautosource; 

نصائح أخرى

يجب تحديد الماكرو قبل أن يسمى. لأسباب الأداء، من الأفضل عدم تحديد ماكرو داخل آخر - إذا قمت بذلك، فسيتم إعادة تعريفه في كل مرة تقوم فيها بالاتصال بالماكرو الخارجي. ما يلي يعمل بشكل جيد:

%macro a;
  %put a;
  %b
%mend a;

%macro b;
  %put b;
  %c
%mend b;

%macro c;
  %put c;
%mend c;

%*-- %a is main --*;
%a
/* on log
a
b
c
*/

يجب عليك تحديد ماكرو قبل أن يتم استدعاؤه، لذلك سيحتاج الخط مع "٪ A" إلى اتباع تعريف الماكرو A. ترتيب تعريفات الماكرو الأخرى لا يهم، طالما يتم تعريفها قبل أن يتم استدعاؤها. عادة في برامجي قمت بإعداد ماكرو رئيسي مثلك، ثم يدعو السطر الأخير من البرنامج هذا الماكرو.

هناك خيار آخر يجب مراعاته هو إعداد مكتبة AutoCall الماكرو، والتي تحتوي على تعريفات العديد من وحدات الماكرو. يعمل هذا بشكل أفضل على وحدات الماكرو القابلة لإعادة الاستخدام، حتى لا تضطر إلى إعادة تعريفهم في كل برنامج.

يوجد جانبان من كود الماكرو في SAS لتحديده: رمز الماكرو الذي يتم تجميعه ومعلمات الماكرو:

رمز ماكرو:

رمز الماكرو نفسه بسيط للغاية في ذلك عندما %macro يواجه الرمز المميز أن نظام SAS يبدأ في ترجمة ماكرو SAS ويحافظ على تجميعه حتى يضرب %mend رمزية. المشاكل الحقيقية الوحيدة التي يمكنك التوصل إليها هي إذا قمت بتحديث رمز ماكرو ولا تعيد ترجمةها قبل تنفيذها - في هذه الحالات، فستظل تشغيل الإصدار القديم الذي يحتوي عليه في مكتبة الماكرو. حسب الملحق، إذا حاولت ترجمة ماكرو يستدعي ماكرو آخر لم يتم تعريفه بالفعل ثم ستحصل على خطأ. لهذه الأسباب، يحتاجون إلى برمجتها بالترتيب الذي يطلق عليه (كما هو موضح في المثال أدناه:٪ المستوى 3 يأتي قبل٪ المستوى 2، والذي يأتي قبل٪٪ 1)

متغيرات ماكرو:عند تحديد ماكرو المتغيرات هناك نوعان من النطاط: العالمية والمحلية. بمجرد تحديد، يمكن الوصول إلى المتغيرات العالمية في أي مكان وفي أي وقت. ومع ذلك، توجد المتغيرات المحلية فقط محليا أثناء تنفيذ الماكرو الذي تم تعريفه فيه. حسب الامتداد، إذا كان الماكرو حيث تم تعريف المتغير المحلي مكالمات أي وحدات ماكرو أخرى، فإن متغير الماكرو المحلي ستظل يمكن الوصول إليه:

مثال العام:

في المثال التالي، وحدات الماكرو هي محددة في ترتيب عكسي لمنع ساس العودة استدعاء واضح من الماكرو تحذير.

يوضح الرسم البياني أدناه هيكل وحدات الماكرو التالية في المثال التالي:

|-----------------------------|
|GLOBAL                       |
|  |------------------------| |
|  |LEVEL1                  | |
|  |  |-------------------| | |
|  |  |LEVEL2             | | |
|  |  |  |--------------| | | |
|  |  |  |  LEVEL3      | | | |
|  |  |  |--------------| | | |
|  |  |-------------------| | |
|  |------------------------| |
|-----------------------------|

ترجمة وحدات الماكرو المتداخلة:

 %macro level3 ;
  %put **** START LEVEL3 **** ;
  %local G1;
  %let G1=Local ;

  %do i=1 %to 2 ;
    %put In the macro do loop I=&i ;
  %end ;

  %put The value of I at level3 is: &I ;
  %put Are we accessing global or local G1 variable here: &G1 ;

  %put **** END LEVEL3 ****;
%mend level3 ;


 %macro level2 ;
  %put **** START LEVEL2 **** ;
  %*global L1 ; *<-- this would produce an error because the variable name has already been added to the local scope in %level1 ;

  %put Are we accessing global or local G1 variable here: &G1 ;
  %put Can we access local variables here: &L1 ;

  %level3 ;

  %put The value of I in level2 is: &I ;
  %put **** END LEVEL2 ****;
%mend level2 ;

ترجمة الماكرو المستوى الأعلى (الذي يستدعي بدوره وحدات الماكرو أعلاه) وتشغيله:

%let G1=Global;
%macro level1 ;
  %put **** START LEVEL1 **** ;
  %let L1=Yes;

  %put Are we accessing global or local G1 variable here: &G1 ;
  %put Can we access local variables here: &L1 ;

  %level2 ;

  %put The value of I outside of the local macro is: &I ;
  %put Are we accessing global or local G1 variable here: &G1 ;

  %put **** END LEVEL1 ****;
%mend level1 ;
%level1 ;

يشير إلى ملاحظة عند مراجعة السجل:

  • خارج٪ المستوى 3، وأعدت تحذير أن متغير الماكرو غير موجود
  • ضمن٪ المستوى 3، عندما يتم استدعاء AND & G1، فإنه يعيد القيمة المخزنة في النطاق المحلي من٪ المستوى 3.Once خارج المستوى 3، تعود القيمة إلى القيمة المخزنة عالميا
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top