Kapitel 2. Präprozessordirektiven

Inhaltsverzeichnis

Allgemeines
Kommentare
Include
Define
Makro

Allgemeines

Die Verarbeitung eines Q. Skripts zum Interview läuft in zwei Schritten ab. Ehe das Skript im zweiten Durchlauf inhaltlich ausgewertet wird, erfolgt zuerst eine reine Auflösung sogenannter Präprozessordirektiven. Mit ihnen ist es möglich Skriptbestandteile aus externen Dateien einzubinden, Schablonen anzulegen, um ähnliche Skriptabschnitte zu komprimieren oder Teile des Skripts grundsätzlich nur bedingt zu berücksichtigen.

Dafür stehen die funktionell benannten Befehle #Include, #Macro und #Define zur Verfügung. Sie alle haben gemeinsam, dass sie im Skript in der ersten Spalte einer Zeile mit dem Rautenzeichen beginnen. Außerdem besteht die Möglichkeit, Bereiche im Q. Skript als Kommentar zu markieren.

Kommentare

Kommentare in Q. geben Skriptverfassern die Möglichkeit Notizen oder Hinweise zu vermerken, die bei der Verarbeitung des Skripts unberücksichtigt bleiben. Sie lassen sich aber auch nutzen, um ganze Bereiche des Skripts beim Entwickeln oder zum Testen außer Funktion zu setzen.

  • Ein doppelter Schrägstricht, //, kommentiert den Rest der Zeile aus.

  • Block-Kommentare über mehrere Zeilen beginnen mit /* und schließen mit */

// diese Zeile ist eine Kommentarzeile
    
SingleQ dummy; // und auch innerhalb von Zeilen geht das
    
/*
und dies ist ein auskommentierter Bereich mit mehreren Zeilen, 
wobei auch die folgende SingleQ dummy2 nicht mehr eingelesen wird

SingleQ dummy2;
*/
    

Include

#include "demografie.q"
    

Mit der Include-Direktive lassen sich Inhalte einer ebenfalls im text-Verzeichnis liegenden Datei einbinden. Die Include-Zeile wird durch den Inhalt der referenzierten Datei ersetzt. Auf diese Art lassen sich lange Fragebögen strukturieren und auf mehrere Dateien verteilen. Zudem können so mehrere Personen gleichzeitig an einem Fragebogen arbeiten. Außerdem lassen sich auf diese Weise auch projektübergreifende, wiederkehrende Skriptteile kapseln und bei Bedarf einbinden. Wie im Beispiel könnte es einen standardisierten Demografieteil geben, der einmal geskriptet und mehrfach benutzt wird.

Define

#define testmode
    
// ...
    
#ifdef testmode
  HTML{ backbutton = yes; };
#endif
    

Mit den Define-Direktiven können Skriptzeilen bei der Skriptverarbeitung bedingt berücksichtigt werden. #define X aktiviert einen Parameter X, der später als Bedingung verwendet werden kann. Das Aktivieren eines Parameters kann ebenfalls über die Start-URL des Interviews gesteuert werden.

https://...&define=testmode&define=NOCHEINPARAMETER
    

Mit #ifdef X ("wenn aktiviert") und #endif bzw. #ifndef X ("wenn nicht aktiviert") und #endif kann anschließend ein Bereich im Skript eingeschlossen werden, der bei der Skriptverarbeitung nur dann berücksichtigt wird, wenn Parameter X aktiviert bzw. nicht aktiviert ist.

Mit diesem Mittel lässt sich ein Skript schreiben, das unterschiedliche Varianten eines Fragebogens vorsieht, die über die URL Parameter im Startlink steuerbar sind. Über diesen Mechanismus ließe sich der Fragebogen optional mit bestimmten Einstellungen (Zurückbutton, Tastatureingabe, ...), mit bestimmten Fragenteilen oder im Testmodus (ohne Datenablage, Quotenzählung) starten.

Die aus anderen Programmiersprachen bekannten Verzweigungsmöglichkeiten über #elseif oder #elsif kennt Q. nicht.

Makro

Mit #macro X und #endmacro lässt sich ein Skriptbereich eingrenzen, der für sich allein funktionslos bleibt. Es handelt sich um eine Vorlage, die mit &X; beliebig oft verwendet (instanziiert) werden kann. Ein solches Makro lässt sich auch als einfacher Textersatz verstehen.

// BEISPIEL 1
#macro labellist
labels=
1 "sehr gut"
2 "gut"
3 "mittel"
4 "schlecht"
5 "sehr schlecht"
;
#endmacro

SingleQ spot1;
text="Wie gefiel Ihnen der erste Werbespot?";
&labellist;
    

Beispiel 1 enthält ein Makro labellist mit einer Labelliste, die im Fragebogenverlauf möglicherweise oft wiederkehrt. Hier ein Makro zu formulieren, spart viel Schreibarbeit, und bietet auch die Möglichkeit, den Inhalt an einer Stelle zentral zu pflegen. Wenn die Skala geändert werden soll, muss sie nur an dieser einen Stelle umgeschrieben werden.

// BEISPIEL 2
#macro auto_schablone
SingleQ auto$Nummer;
text="Gefällt Ihnen der $Modell besser als Ihr jetziges Auto?";
labels=
1 "Ja"
2 "Nein"
;
flt=($Nummer in modellauswahl);
#endmacro

&auto_schablone;$Nummer="1";$Modell="VW Passat";
&auto_schablone;$Nummer="2";$Modell="Skoda Oktavia";
&auto_schablone;$Nummer="3";$Modell="Audi A4";
&auto_schablone;$Nummer="4";$Modell="Ford Mondeo";
    

Wir können ein Makro mit Platzhaltern formulieren, die beim Aufruf durch die eigentlichen Werten ersetzt werden:

      
	&X;ERSATZ1="NEUERTEXT1";ERSATZ2="NEUERTEXT2";...;
      

Q. ersetzt beim Expandieren des Makros die Platzhalter durch die Werte.

In Beispiel 2 wird das Makro auto_schablone verwendet um mehrere ähnliche Fragen anzulegen. Der Platzhalter $Modell sorgt dafür, dass ein bestimmtes Fahrzeug im Fragetext eingefügt wird, während der Platzhalter $Nummer einerseits dafür sorgt, dass die Fragen eindeutige Namen bekommen und andererseits gefiltert abgefragt werden. Der benutzte Filter setzt voraus, dass es eine Frage modellauswahl gibt, die eine Fahrzeugvorselektion mit entsprechend nummerierten Labels gibt.

Als Platzhalter kann streng genommen jeder beliebige Text verwendet werden. Der im Beispiel verwendete Platzhalter »$Modell« würde im Text der Frage »auto1« durch »VW Passat« ersetzt. Es ist unbedingt empfehlenswert Platzhalter in einer beliebigen, genormten Form kenntlich zu machen. Man könnte, wie hier, die Platzhalter z.B. immer mit dem Dollarzeichen beginnen lassen, also »$ERSATZ1« statt »ERSATZ1« schreiben.

Durch Makros lassen sich Skripte oft übersichtlicher, einfacher und schneller erstellen. Makros können allerdings auch schnell kryptisch und unübersichtlich wirken, wenn es zu Verschachtelungen von Makros in Makros mit ähnlichen oder weitergereichten Platzhaltern kommt. Wir raten daher, Makros mit aussagekräftigen Namen zu versehen und sie ausreichend zu kommentieren.

Bitte beachten: Beim Auflösen eines Makros liest Q. Platzhalter Zeichen für Zeichen ein. Das kann bei nummerierten Platzhaltern (z.B. $1) zu Fehlern führen, wenn nicht berücksichtigt wird, dass beim Platzhalter $10 Q. nicht die Zahl 10 berücksichtigt, sondern erneut p1 erkennt und daran eine 0 anhängt.

Zudem sollten Unix-gewohnte Anwender im Kopf behalten, dass das »$«-Zeichen für Q. nur ein Zeichen ist und nicht wie in der Shell eine gesonderte Bedeutung hat.