Was ist OPL?

Schon die 3-er Serie des Psions wurde mit OPL-Programmiersystem ausgeliefert. Im Klartext bedeutet dies: Man kann auf dem Psion selbst seine eigenen Programme erstellen.
OPL ist eine BASIC-ähnliche Interpretersprache. Die Programme werden zwar vor-compiliert, dann aber interpretativ abgearbeitet.
Meine eigenen Programme, die auf dem Psion laufen, sind in OPL geschrieben, das Dorf-Spiel und der Zeitstrahl eingeschlossen.

Der Programm-Editor

Seine OPL-Programme schreibt man im Programmeditor. Vor der Ausführung muß ein Programm übersetzt werden (Schaltfläche "Übersetzen" auf einem Psion 5(mx) oder gleichnamige Funktion aus dem Menü "Extras"), auch, wenn es danach interpretativ abgearbeitet wird. Man kann (auf einem Psion) ausführbare Programmdateien erzeugen. Im einfachsten Falle ist das eine OPO-Datei, die dann durch Doppeltippen gestartet werden kann.
Ruft man den Programmeditor auf, so erzeugt er automatisch einen Programmrahmen, in den man als erstes den Namen der ersten Prozedur eingibt.

Wie sieht OPL aus?

In OPL schreibt man Prozeduren. Deshalb fängt jedes Programm mit dem Befehl "Proc" an. Abgeschlossen wird eine solche Prozedur mit dem Befehl Endp. Das "Hallo Welt"-Programm sieht ganz einfach aus:

Proc Welt:
  Print "Hallo Welt!"
  Get
Endp
Nach dem Print-Befehl würde das Programm sofort beendet werden, und es wäre gar nichts zu sehen. Deshalb wurde die Tastaturabfrage mit dem Befehl "Get" eingefügt. Die Ausgabe am Bildschirm bleibt dann bis zum nächsten Tastendruck sichtbar.

Man kann eine Prozedur aus einer anderen heraus aufrufen. Angenommen, ich habe mir ein PrintWait-Befehl als Prozedur geschrieben, die nach der Bildschirmausgabe auf eine Taste wartet, dannn sieht das Hallo-Welt-Programm so aus:

Proc Welt:
  PrintWait:("Hallo Welt!")
Endp

Proc PrintWait:(text$)
  Print text$
  Get
Endp

Benutzung von Variablen

Variable müssen vor der Benutzung im Programm deklariert werden. Dazu dienen der Global- und der Local-Befehl. Letzterer deklariert Variable, die nur innerhalb der aktuellen Prozedur gültig sind. Global deklariert über Prozedurgrenzen hinweg gültige Variable.
Der Typ der definierten Variablen wird durch das letzte Zeichen festgelegt:
% für Integer
& für Long Integer
$ für Zeichenketten

Proc Test:
  Local i%,Text$(80)
  i%=4
  Text$="Hallo, das ist ein Test."
  Print Text$
  Print "i% hat den Wert: ";i%
  Print
  Print "Bitte eine Taste drücken!"
  Get
Endp
In diesem Beispielprogramm werden zunächst zwei lokale Variablen deklariert, eine Ganzzahl-Variable sowie eine Zeichenketten-Variable. Dann werden beiden Variablen Werte zugewiesen.
Die Ausgabe des Progrämmchens sieht in etwa so aus:

Hallo, das ist ein Test.
i% hat den Wert 4

Bitte eine Taste drücken!

Schleifen

Es gibt in OPL keine For...Next Schleifen, wie im BASIC. Es gibt die Do...Until Schleife, die wiefolgt verwendet wird:

Proc Test:
  Local i%
  i%=0
  Do
    i%=i%+1
    Print "Das ist Schleifendurchlauf Nummer ";i%
  Until i%=5
  Print "Bitte eine Taste drücken!"
  Get
Endp
Diese Prozedur durchläuft die Do...Until Schleife solange, bis die Integer-Variable i% den Wert 5 erreicht hat. Bei jedem Durchlauf wird der Wert von i% um 1 erhöht und es erfolgt eine Bildschirmausgabe mit dem erreichten Wert.
Die Ausgabe des Programms sieht in etwa so aus:

Das ist Schleifendurchlauf Nummer 1
Das ist Schleifendurchlauf Nummer 2
Das ist Schleifendurchlauf Nummer 3
Das ist Schleifendurchlauf Nummer 4
Das ist Schleifendurchlauf Nummer 5
Bitte eine Taste drücken!

Verzweigungen

Programmverzweigungen werden mit If...Else...Endif realisiert. Im folgenden Beispiel sollen wieder 5 Schleifensurchläufe erfolgen. Das Programm soll entscheiden, ob es sich beim momentanen Zählerstand um eine gerade oder ungerade Zahl handelt, und soll das Resultat am Bildschirm ausgeben. Dazu benutzen und modifizieren wir das Beispiel aus dem vorangegangenen Abschnitt:

PROC test:
  Local i%
  i%=0
  Do
    i%=i%+1
    If i%/2*2=i%
      Print i%;" ist eine gerade Zahl"
    Else
      Print i%;" ist eine ungerade Zahl"
    Endif
  Until i%=5
  Get
ENDP
Die Ausgabe des Programms sieht dann in etwa so aus:

1 ist eine ungerade Zahl
2 ist eine gerade Zahl
3 ist eine ungerade Zahl
4 ist eine gerade Zahl
5 ist eine ungerade Zahl
Angenommen, unser Programm soll nur die geraden Zahlen herausfiltern und am Bildschirm ausgeben, dann brauchen wir nicht die komplette If...Else...Endif Struktur zu verwenden, sondern es genügt dann eine einfachere If-Anweisung, die wir in eine Zeile schreiben, wie hier:

  Do
    i%=i%+1
    If i%/2*2=i% : Print i%;" ist eine gerade Zahl" : Endif
  Until i%=5

Menüs definieren

Menüs können sehr einfach definiert werden. Der Befehl mInit leitet die Menü-Definition ein. mCard definiert ein Menü; als Parameter folgen der Name des Menüs, der Name der ersten Funktion sowie der Zeichencode, der zurückgegeben werden soll. Die anderen Menüfunktionen folgen im gleichen Stil: Name2, Code2, ... , Name(n), Code(n).
Jeder Psion hat eine Taste mit der Aufschrift "Menü", die den Code 290 liefert. Wenn die gedrückt wird, soll das definierte Menü erscheinen. Genau dies tut unser folgendes kleines Programm. Die Tastatureingabe erwartet es mit dem Befehl GET. Das vorher definierte Menü wird mit dem Befehl MENU aufgerufen, der den für die gewählte Menüfunktion festgelegten Zeichencode zurückgibt:

PROC menu:
  Local m%,k%
  Do
    mInit
    mCard "Datei","Öffnen",97,"Schließen",65
    mCard "Bearbeiten","Keine Lust",66,"END",67
    k%=Get
    If k%=290 : m%=MENU : Endif
    print m%
    Until m%=67
ENDP
So sieht das oben definierte Menü aus:



WIRD FORTGESETZT