Die Version 2.0 des Betriebssystems macht intensiven Gebrauch von sogenannten ,,TagItems``.
Deren Deklaration gestaltet sich etwa folgendermassen:
Die Prozeduren erwarten also als Parameter einen Zeiger auf ein offenes Feld aus Langworten.
In Intuition gibt es z.B. neu die Prozedur:
Mit Hilfe der Tags können mehr Parameter angegeben werden, als es in der NewWindow-Struktur möglich wäre. Hier kann sogar der Zeiger auf NewWindow NIL sein, womit dann alle Einstellungen über die Tags vorgenommen werden. Jede Eigenschaft -- Breite, Höhe, Flags, und so fort -- des neuen Fensters wir durch ein TagItem festgelegt. Nicht angegebene Eigenschaften bekommen einen Vorgabewert zugewiesen.
In gestaltet sich ein derartiger Aufruf im Gegensatz zur Sprache C sehr aufwendig, was an einem Beispiel demonstriert werden soll:
Um diesen Aufwand zu reduzieren, wurde eine neue Standard Prozedur implementiert:
SYSTEM.TAG(VAR x:AnyType;
val {,val}:ADDRESS):ADDRESS;
Der erste Parameter ist eine Variable beliebigen Typs, die als Speicherbereich zur Aufnahme der nachfolgenden Langworte dient. Sie muss gross genug sein, um alle Langworte aufnehmen zu können. Sie darf kein offener Feldparameter sein. Falls eine der Bedingungen nicht zutrifft, erfolgt eine Fehlermeldung.
Die nachfolgenden Parameter dürfen beliebigen skalaren Typs oder Mengen sein. Sie werden implizit in den Typ ADDRESS konvertiert, also je nach Typ vorzeichenlos oder vorzeichenbehaftet auf Langworte erweitert; Mengen sind in diesem Sinne vorzeichenlos. Der Typ BOOLEAN wird wie üblich gehandhabt, d.h. FALSE ergibt ADDRESS(0), TRUE ergibt ADDRESS(1), wie es das Betriebssystem auch erwartet. Im allgemeinen wird sowieso nur auf 0 getestet.
Der genaue Algorithmus ist:
(*$ RangeChk:=FALSE OverflowChk:=FALSE *) IF valtyp=set THEN valtyp:=SHORTCARD|CARDINAL|LONGCARD END; buffer[i]:=ADDRESS(val); (*$ POP RangeChk POP OverflowChk *)
Der Rückgabewert der Prozedur TAG ist die Adresse der übergebenen Variablen.
Der Aufruf nach obigem Beispiel sieht hiermit nun so aus:
VAR bufferForAllTags: ARRAY [0..50] OF LONGINT; ... win:=OpenWindowTagList(NIL,SYSTEM.TAG(bufferForAllTags, waLeft, 20, ..., ..., waPubScreenFallBack, TRUE, waTitle, ADR("MyWindow"), waIDCMP, IDCMPFlagSet{...}, tagEnd)); (* niemals vergessen! *)
Obwohl diese Prozedur nur für die TagItems entwickelt wurde, kann sie natürlich auch anderweitig verwendet werden, z.B. um Arrays zu initialisieren oder auch für die Prozedur Terminal.Format. Hierbei muss aber bedacht werden, dass sie nur Langworte verarbeitet! Bei der Format-Prozedur muss also immer (bis auf %s) das ,,l`` mit angegeben werden!