Sauber skripten

Seit 10 Jahren biete ich Schulungen zur FrameScript-Programmierung an. Nein, falsch, es geht nicht ums Programmieren, es geht darum, FrameMaker-Prozesse zu automatisieren. Und der Einstieg dazu ist nunmal immer noch die Skript-Programmierung. Wenn ich manchmal im frame_dev-Forum mitlese, wie kompliziert bestimmte Aktionen bei der Programmierung in C ausfallen (und dass sich der Programmierer auch um das Freigeben nicht benötigten Speichers kümmern muss), dann bin ich dankbar für FrameScript.

Einschub: So dankbar ich für FrameScript bin, so gerne nutze ich für bestimmte Aufgaben auch »echte« C-Plug-ins mit FrameMaker, insbesondere mit strukturierten Dokumenten. Zum Beispiel AXCM, InsetPlus, FrameSLT

Bei diesen Schulungen fällt immer wieder auf, dass FrameScript keine Deklaration der Variablen erfordert, man kann einfach schreiben

Set lvValues = MyFunction{};

und die Variable lvValues wird den Datentyp des Ergebnisses der Funktion MyFunction annehmen. Was einerseits sehr praktisch zu sein scheint, führt aber beim kleinsten Tippfehler im Namen einer Variable oft nicht zu einem gemeldeten Fehler, sondern schlicht zu unerwartetem Verhalten des Skripts. Tipps ich ein paar Zeilen weiter beispielsweise

Display lvValue;

bekomme ich diese wenig aussagekräftige Anzeige, weil ich das Plural-s beim Variablenbezeichner »vergessen« habe.

Es gibt aber eine Möglichkeit, solche Fehler melden zu lassen, und ich möchte heute dazu aufrufen, diese Möglichkeit sehr diszipliniert zu verwenden. Seit einigen Versionen gibt es die Session-Variable DeclareVarMode, die dazu verwendet werden kann, dass alle Variablen explizit entweder als Local oder als GlobalVar deklariert werden müssen. Folgende zwei Zeilen gehören in jedes Skript:

Set DeclareVarMode = True;
Set PlatformEncodingMode = True;

(Wegen der Rückwärtskompatibilität sind beide nicht standardmäßig gesetzt; den PlatformEncodingMode können Sie ignorieren, wenn Sie für FrameMaker 8 oder später im UTF-8-Mode programmieren.)

Und dann natürlich in jede Funktion oder Subroutine die entsprechenden Anweisungen Local oder GlobalVar.

Haben Sie das bereits ausprobiert? Wie sind Ihre Erfahrungen? Wie lange haben Sie schon nach Fehlern gesucht, nur um schließlich feststellen zu müssen, dass Sie sich bei einem Variablen-Bezeichner vertippt haben…