Ich hatte von Anfang an ein gute Gefühl bei REPLACEX, eine der wichtigen Neuerungen des
APL2 Service Level 11 vom November letzten Jahres. Im ICE von Hamburg nach Berlin hatte ich vor der GSE Herbsttagung 2007 Gelegenheit, REPLACEX ein wenig zu testen. Die Ergebnisse des Vergleichs mit REPLACEV, einer Funktion aus 1 UTILITY, mit verschieden langen Vektoren bzw. Teilvektoren waren überragend. Je länger die Zeichenkette, in der die Ersetzungen vorgenommen wurden, desto größer wurde der Unterschied zugunsten von REPLACEX.
REPLACEX funktionierte sogar noch, als REPLACEV mit WS FULL endgültig aufgeben musste. Dabei ist REPLACEV keine schlechte APL2-Variante für das Ersetzen der Vorkommen einer Zeichenkette durch eine beliebige andere.
Dies waren Versuche außerhalb jeglicher ernsthafter Anwendungen. Tatsächlich gehört das Ersetzen von Teilstrukturen durch Strukturen mit unterschiedlicher Dimension nicht zu den Stärken von APL, nicht nur in Sachen Performance. Das ist anders bei jeweils gleicher Größe. Der einfachste Fall, der im wirklichen Leben auch oft vorkommt, ist das Ersetzen von Dezimalpunkten durch Kommata und umgekehrt.
Dafür und entsprechend gelagerte Fälle gibt es seit APL2 eine kompakte Schreibweise:
(('.'=,ARRAY)/,ARRAY)←','
oder für ein beliebig geschachteltes ARRAY:
(('.'=∊ARRAY)/∊ARRAY)←','
Allerdings kann der zweite Ausdruck bei großen Matrizen mit mindestens Tiefe 2 - z.B. eine Matrix mit Zeichenketten als Elemente - auf dem Mainframe zu einem SYSTEM LIMIT führen. )MORE zeigt ein "Implementation Restriction", auch nicht konkreter. Da ist wohl wieder eine interne Tabelle vollgelaufen, in diesem Falle die "Reference Table".
Mit Workstation APL2 funktioniert diese Schreibweise erst gar nicht, eine der unangenehmen Inkompatibilitäten. Schade!
In beiden Fällen hilft REPLACEX, hier am Beispiel einer beliebigen Matrix aus Zeichenketten:
ARRAY←(⊂'.,')REPLACEX¨ARRAY
Für beliebig geschachteltes ARRAY bedient man sich als Ersatz für den zweiten Ausdruck des Operators PR aus 1 EXAMPLES:
ARRAY←'.,' REPLACEX PR ARRAY
REPLACEX hilft aber nicht nur bei der Beseitigung einer Inkompatibilität, unter Workstation APL2 bringt es sogar Geschwindigkeit. Im Fall einer flachen Zeichenmatrix CSVN mit mehr als 6 Millionen Elementen braucht der Ausdruck
CSVN←(⍴CSVN)⍴'.,' REPLACEX,CSVN
auf einem 2 GHz-Prozessor etwas mehr als 10 CPU-Millisekunden während
(('.'=,CSVN)/,CSVN)←','
die 8-fache Zeit in Anspruch nimmt.
Nicht ganz überraschend sieht das für APL2 auf dem Mainframe anders aus: Dort ist die klassische APL2-Lösung ca. doppelt so schnell wie das Ersetzen mit REPLACEX. Selbst bei einer nur leicht schlechteren Performance würde ich natürlich dieser reinen APL2-Schreibweise den Vorzug geben.
Die hier angegebenen Vergleiche sich natürlich mit Vorsicht zu genießen. Die gemessenen Werte hängen stark von der Größe der Matrix und der Anzahl der auszutauschenden Elemente ab.