Übersicht (DEFINE-!Befehl ENDDEFINE)

DEFINE—!ENDDEFINE definiert ein Programmmakro, das dann innerhalb einer Befehlsfolge verwendet wird. Ein Makro kann in verschiedenen Kontexten nützlich sein. Sie kann beispielsweise für Folgendes verwendet werden:

  • Setzen Sie eine Reihe gleicher oder ähnlicher Befehle wiederholt ab und verwenden Sie dabei Schleifenkonstrukte anstelle redundanter Spezifikationen.
  • Geben Sie eine Gruppe von Variablen an.
  • Ausgabe mehrerer Programmprozeduren mit einem einzigen Befehl erzeugen.
  • Erstellen Sie komplexe Eingabeprogramme, Prozedurspezifikationen oder ganze Sitzungen, die dann ausgeführt werden können.

Ein Makro wird definiert, indem ein beliebiger Teil eines gültigen Befehls angegeben und ihm ein Makroname zugeordnet wird. Dieser Name wird dann in einem Makroaufruf innerhalb einer Befehlsfolge angegeben. Wenn das Programm den Makronamen findet, erweitert es das Makro.

In den Beispielen der Makrodefinition in dieser Referenz werden der Makroname, der Hauptteil und die Argumente zur besseren Lesbarkeit in Kleinbuchstaben angezeigt. Makroschlüsselwörter, denen immer ein Ausrufezeichen (!) vorangestellt ist, werden in Großbuchstaben angezeigt.

Optionen

Makroargumente. Sie können Argumente in der Makrodefinition deklarieren und verwenden und anschließend diesen Argumenten im Makroaufruf bestimmte Werte zuweisen. Sie können Standardwerte für die Argumente definieren und angeben, ob ein Argument erweitert werden soll, wenn das Makro aufgerufen wird. Siehe das Thema Makroargumente (DEFINE-!Befehl ENDDEFINE) .

Makroanweisungen. Sie können die Makroerweiterung ein-und ausschalten. Siehe das Thema Makroanweisungen (DEFINE-!Befehl ENDDEFINE) .

Funktionen zur Bearbeitung von Zeichenfolgen Sie können eine oder mehrere Zeichenfolgen verarbeiten und entweder eine neue Zeichenfolge oder eine Zeichendarstellung eines numerischen Ergebnisses erstellen. Siehe das Thema Funktionen zur Bearbeitung von Zeichenfolgen (DEFINE-!Befehl ENDDEFINE) .

Bedingte Verarbeitung. Sie können bedingte und Schleifenkonstrukte erstellen. Siehe das Thema Bedingte Verarbeitung (DEFINE-!Befehl ENDDEFINE) .

Makrovariablen. Sie können Makrovariablen direkt Werte zuordnen. Siehe Direkte Zuordnung von Makrovariablen (DEFINE-!Befehl ENDDEFINE) .

Basisspezifikation

Alle Makros müssen mit DEFINE beginnen und mit !ENDDEFINEenden. Diese Befehle geben den Anfang und das Ende einer Makrodefinition an und werden verwendet, um die Makrodefinition von der übrigen Befehlsfolge zu trennen.

  • Geben Sie unmittelbar nach DEFINEden Makronamenan. Alle Makros müssen einen Namen haben. Der Name wird im Makroaufruf verwendet, um auf das Makro zu verweisen. Makronamen können mit einem Ausrufezeichen (!) beginnen, folgen jedoch ansonsten den üblichen Namenskonventionen. Ein Name beginnt mit einem! stellt sicher, dass keine Konflikte mit dem anderen Text oder den anderen Variablen in der Sitzung auftreten.
  • Geben Sie unmittelbar nach dem Makronamen eine optionale Argument definition in Klammern an. Diese Spezifikation gibt die Argumente an, die gelesen werden, wenn das Makro aufgerufen wird. Wenn Sie keine Argumente einschließen wollen, geben Sie nur die runden Klammern an. Die runden Klammern sind erforderlich, unabhängig davon, ob sie ein Argument einschließen.
  • Geben Sie als Nächstes den Hauptteil des Makros an. Der Makrohauptteil kann Befehle, Teile von Befehlen oder Makroanweisungen (Makroanweisungen, Anweisungen zur Bearbeitung von Zeichenfolgen sowie Schleifen und bedingte Verarbeitungsanweisungen) enthalten.
  • Geben Sie am Ende des Makrohauptteils !ENDDEFINEan.

Geben Sie zum Aufrufen des Makros einen Makroaufruf in der Befehlsfolge aus. Zum Aufrufen eines Makros geben Sie den Makronamen und alle erforderlichen Argumente an. Wenn keine Argumente vorhanden sind, ist nur der Makroname erforderlich.

Operationen

  • Wenn das Programm die Makrodefinition liest, wird der gesamte Text (außer Argumente), der nicht in Anführungszeichen eingeschlossen ist, in Großbuchstaben umgesetzt. Argumente werden in Groß-und Kleinbuchstaben gelesen.
  • Die Makrofunktion erstellt keine Befehle und führt sie nicht aus, sondern erweitert Zeichenfolgen in einem Prozess, der als Makroerweiterungbezeichnet wird. Ein Makroaufruf leitet die Makroerweiterung ein. Nachdem die Zeichenfolgen erweitert wurden, werden die Befehle (oder Teile von Befehlen), die die erweiterten Zeichenfolgen enthalten, als Teil der Befehlsfolge ausgeführt.
  • Alle Elemente im Makroaufruf, die nicht in der Makroerweiterung verwendet werden, werden gelesen und mit den erweiterten Zeichenfolgen kombiniert.
  • Die erweiterten Zeichenfolgen und die übrigen Elemente des Makroaufrufs (falls vorhanden) müssen den Syntaxregeln des Programms entsprechen. Ist dies nicht der Fall, generiert das Programm je nach Art des Syntaxproblems entweder eine Warnung oder eine Fehlernachricht.

Syntaxregeln

Wie andere Befehle müssen erweiterte Makros den Regeln des Verarbeitungsmodus entsprechen, unter dem sie ausgeführt werden. Obwohl es wünschenswert ist, eine Makrosyntax zu erstellen, die sowohl im interaktiven Modus als auch im Stapelmodus ausgeführt wird, kann dies manchmal zu einer Komplexitätsschicht führen, die Sie vermeiden möchten. Es wird daher empfohlen, eine Makrosyntax zu schreiben, die interaktiven Syntaxregeln entspricht, und die Jobs so zu strukturieren, dass die Makrosyntax unter interaktiven Syntaxregeln ausgeführt wird.

  • DEFINE und !ENDDEFINE müssen vollständig geschrieben sein. Sie können nicht abgekürzt werden.
  • Die Makroanweisung !ENDDEFINE sollte mit einem Punkt enden. Ein Punkt als letztes Zeichen in einer Zeile wird im interaktiven Modus als Befehlsabschlusszeichen interpretiert.
  • Andere Makroanweisungen (z. B. !IF, !LOOP, !LET) sollten nicht mit einem Punkt enden.
  • Text im Hauptteil des Makros, der Befehle darstellt, die generiert werden, wenn das Makro erweitert wird, sollte den Punkt am Ende jedes Befehls enthalten, und jeder Befehl sollte in einer neuen Zeile beginnen.

Der Makrohauptteil darf die Zeichen \ oder ^ nur enthalten, wenn sie in einer Zeichenfolge in Anführungszeichen enthalten sind (siehe "a valid backslash \ in a quoted string").

Beispiel

DEFINE !macro1(type = !DEFAULT(1) !TOKENS(1)
                             /varlist=!CMDEND)
!IF (!type = 1)!THEN
frequencies variables=!varlist.
!ELSE
descriptives variables=!varlist.
!IFEND
!ENDDEFINE.
  • Die Makroanweisungen DEFINE, !IF, !ELSEund !IFEND enden nicht mit einem Punkt.
  • !ENDDEFINE endet mit einem Punkt.
  • Die vom Makro generierten Befehle FREQUENCIES und DESCRIPTIVES beginnen jeweils in einer neuen Zeile und enden mit einem Punkt.

Gehen Sie wie folgt vor, um Ihre Befehlssyntaxjobs so zu strukturieren, dass interaktive Verarbeitungsregeln immer anstelle von Stapelverarbeitungsregeln verwendet werden:

  • Verwenden Sie INSERT anstelle von INCLUDE , um Befehlsdateien, die Makros enthalten, mit anderen Befehlsdateien zu kombinieren. Weitere Informationen finden Sie in INSERT .
  • Wählen Sie in Produktionsfunktionsjobs Interaktiv als Syntaxeingabeformat aus. Weitere Informationen finden Sie im Thema Produktionsjobs .
  • Verwenden Sie in Batch Facility (nur mit IBM® SPSS® Statistics Server verfügbar) den Schalter -i, um interaktive Verarbeitungsregeln zu verwenden.

Kompatibilität

Verbesserung an den Makrofunktionen können zu Fehlern bei Makros führen, die zuvor fehlerfrei ausgeführt wurden. Wenn ein Makro am Ende eines Befehls aufgerufen wird und sich dort kein Befehlsabschluss befindet (entweder ein Punkt oder eine leere Zeile), wird insbesondere bei Syntax mit interaktiven Regeln der nächste Befehl nach der Makroerweiterung als fortgesetzte Zeile anstelle eines neuen Befehls interpretiert, wie in:

DEFINE !macro1()
var1 var2 var3
!ENDDEFINE.
FREQUENCIES VARIABLES = !macro1
DESCRIPTIVES VARIABLES = !macro1.

Im interaktiven Modus wird der Befehl DESCRIPTIVES als fortgesetzte Zeile des Befehls FREQUENCIES interpretiert und keiner der Befehle wird ausgeführt.

Einschränkungen

  • Die BEGIN DATA—END DATA -Befehle sind in einem Makro nicht zulässig.
  • BEGIN PROGRAM-END PROGRAM -Befehle werden in einem Makro nicht unterstützt.
  • Der Befehl DEFINE ist in einem Makro nicht zulässig.