2009-09-28 7 views
3

Dans d'autres langages de programmation tels que C++, les protections d'inclusion permettent d'éviter les inclusions multiples du même code.La macro SAS inclut des protections

Comme cela en C++:

#ifndef FOO_INCLUDED 
#define FOO_INCLUDED 
.... 
#endif 

Est-il logique de construire des gardes d'inclusion dans vos définitions de fonctions macro SAS? Et comment devrait-il être fait?

Répondre

3

Il ya %SYMEXIST(macro-var-name) macro fonction pour voir si la macro-var existe, mais vous ne pouvez pas écrire %IF à l'air libre, de sorte que vous devez joindre votre instruction %IF à l'intérieur d'une autre macro. Vous pouvez finir par écrire une macro juste pour envelopper votre code dans un fichier source comme ci-dessous. Ce n'est pas joli, mais vous pouvez probablement vous débrouiller avec ça, si le gardien est nécessaire.

%macro wrapper; 
    %if %symexist(foo_defined) %then %return; 
    %macro foo; 
    %global foo_defined; 
    %let foo_defined = 1; 
    %put i am foo; 
    %mend foo; 
%mend wrapper; 

%*-- tests --*; 
options mcompilenote=all; 
%symdel foo_defined; 

%*-- first time it will define %foo --*; 
%wrapper 
%foo 
/* on log 
NOTE: The macro FOO completed compilation without errors. 
     6 instructions 108 bytes. 
i am foo 
*/ 

%*-- second time it will not --*; 
%wrapper 
%foo 
/* on log 
(no notes on macro compilation) 
i am foo 
*/ 

Sur appel, SAS met à la disposition d'un groupe de catalogues, des fichiers et des répertoires pour accéder (compilé/non compilé) macros. Cela rend lourd, mais pas impossible, de découvrir directement qu'une macro est déjà disponible pour cette session ou non, étant donné le nom de la macro. En savoir plus sur les (détails gores) dans cet article: http://support.sas.com/resources/papers/proceedings09/076-2009.pdf

+0

Merci. C'est à peu près l'approche que je visais. –

2

Vous pouvez utiliser le NOMREPLACE option pour éviter toute macro à redéfinir. À mon avis, la réutilisation de noms de macros et de noms de variables macro (et même de noms de fichiers de données) est mauvaise. Si vous ne définissez les choses qu'une seule fois, vous pouvez être relativement sûr de pouvoir soumettre à nouveau n'importe quelle partie du code et espérer obtenir les mêmes résultats qu'à l'origine. Je préfère également séparer les définitions de macro du code à partir duquel elles sont appelées.

+0

Cette option ne vous * empêche * pas de redéfinir les macros qui résident dans vos répertoires SASAUTOS .. sauf si vous appelez les macros en premier, c'est-à-dire. Parce qu'une fois qu'il est appelé, la macro est compilée dans le catalogue de macros dans la bibliothèque de travail, et seulement après cela, cette option bloque la redéfinition. Les détails des macros disponibles pour l'appel étant donné une session est en effet gore. –

Questions connexes