Makros "überschreiben" und "Parent"-Makro rufen?
Verfasst von Jobst Heitzig am 24 Mai, 2007 - 18:22
Hat jemand eine Idee, wie man ein existierendes Makro neu definieren und aus dem neuen Makro das alte rufen kann, ähnlich wie in objektorientierten Sprachen eine überschriebene Methode ihre Parent-Methode rufen kann?
Ziel ist also so etwas:
%macro x; /* alt */
%put Ich tu was.;
%mend;
%put Ich tu was.;
%mend;
%macro x; /* neu */
%x; /* hier soll aber die ALTE Version gerufen werden! */
%put Ich tu was zusätzliches.;
%mend;
»
- Anmelden oder Registrieren um Kommentare zu schreiben

Geht leider nicht
Sowas geht leider nicht.
Der Macro-Preprozessor kennt immer nur einen Namen für genau ein Macro.
Einen Kontext, wie die Klassen einer objektorientierten Sprache sind hier unbekannt.
Man muss einen neuen Namen wählen - oder den alten Code mit übernehmen.
alten Code übernehmen
Das mit dem alten Code übernehmen war auch meine Idee, nur wo bekomme ich den Code des alten Makros im Moment der Kompilierung des neuen Makros her?
Kann man den aus dem kompilierten alten Makro, z.B. aus dem Makrokatalog, extrahieren?
Es nützt ja leider nicht viel, wenn das alte Makro x in einer Codedatei x.sas vorliegt, z.B. als Autocallmakro, denn ich kann im neuen Makro ja nicht %include "x.sas" sagen, weil in x.sas ja wieder %macro x... steht...
so allgemein ist das zu schwierig
Hallo Herr Heitzig,
ich habe noch nicht verstanden, was sie erreichen wollen. Es gibt bei Macros so viele Sonderfälle und Situationen, dass eine allgemeine Anleitung nicht möglich ist.
Die einfachste und m.E. beste Lösung ist ein neuer Name:
* Sas-Anweisungen;
%macAlt(&par1,par2=&par2);
* Und weiter gehts;
%mend;
Aber, wenn ich Sie richtig verstanden habe, gibt es Programme, die %macAlt() aufrufen, und deren Verarbeitung durch das Überschreiben des Macros geändert werden soll. Das geht nur, wenn man vorher, beim Programmieren, den Programm-Code aus macAlt.sas kopiert und anpasst.
Jetzt kommt die dritte Variante ins Spiel: Wenn %macAlt in zwei Versionen verwendet werden soll, aber das ursprüngliche %macAlt weiter gepflegt wird: Wenn man die gemeinsam genutzte Funktion in das Macro %mac0 auslagert, können beide Versionen von %macAlt dasselbe %mac0 aufrufen und den Rest anders implementieren.