In dieser Variante von Collections (die auf Collections-16 basiert) wurden die Operationen First und Next durch Iteratoren ersetzt. Dies hat insbesondere den Vorteil, daß es nun möglich ist, eine Kollektion gleichzeitig mehrfach durchzulaufen.
PROCEDURE GetIterator(collection: Collection; VAR iterator: Iterators.Iterator);
PROCEDURE IterateList(it: Iterators.Iterator; list: Objects.Object; param: SHORTINT); (* ignored *) VAR linkable: Linkable; BEGIN WITH list: List DO linkable := list.head; WHILE linkable # NIL DO Iterators.Yield(it, linkable.object); linkable := linkable.next; END; END; END IterateList;die dann durch die Schnittstellenprozedur GetIterator
PROCEDURE GetIterator(collection: Collections.Collection; VAR iterator: Iterators.Iterator); BEGIN Iterators.Create(iterator, IterateList, collection, 0); END GetIterator;zum Leben erweckt werden kann.
Der vierte Parameter von Iterators.Create wird als dritter Parameter an IterateList übergeben und dient zur vereinfachten Parameterisierung des Iterators, so kann beispielsweise die Reihenfolge spezifiziert werden. In diesem Beispiel wird davon aber kein Gebrauch gemacht.
PROCEDURE PrintCollection(s: Streams.Stream; object: Services.Object); VAR member: Disciplines.Object; first: BOOLEAN; it: Iterators.Iterator; BEGIN WITH object: Collections.Collection DO Write.CharS(s, "("); Collections.GetIterator(object, it); first := TRUE; WHILE Iterators.Get(it, member) DO IF first THEN first := FALSE; ELSE Write.StringS(s, ", "); END; IF member IS Services.Object THEN PrintableObjects.Print(s, member(Services.Object)); ELSE Write.CharS(s, "?"); END; END; Write.StringS(s, ")"); END; END PrintCollection;