28 o++oPS-Beispiele

o++oPS ist eine Endnutzerprogrammiersprache, die Wiederholgruppen einfach verwalten kann. Sie erlaubt es, Anfragen an Tabellen und Dokumente besonders einfach zu formulieren. Da die Sprache nicht nur das Ziel hat Anfragen zu formulieren, wird sie nicht mehr ottoQueryLanguage sondern ottoProgrammierSprache (ottoProgrammingSkript) genannt. Das Projekt wurde beeinflusst von CONVERT, SQL, XML und XQuery. o++oPS unterscheidet sich von "ottoQL" nicht nur durch eine Reihe von syntaktischen Veränderungen sondern auch durch semantische.

1. Eine Wiederholgruppe

Einige der grundlegenden Befehle und Begriffe werden anhand der folgenden Tabelle ottos.tab geklärt. Die Beispiele können unter http://ottops.eu getestet werden.
NAME,                  GEBORENIN,    (TAT,                                   JAHR l)m
Otto der Grosse        Altsachsen(De) Zum König von Deutschland gewählt       936
                                      Die Ungarn auf dem Lechfeld geschlagen  955
                                      Erster Kaiser des Heil. Röm. Reichs     962
Otto von Mähren        Mähren         heiratete Euphemia von Ungarn          1086
Otto von Bismarck      Preußen(De)    mit Zuckerbrot und Peitsche-Politik    1871
                                      Emser Depesche                         1870
                                      Erster Reichskanzler von Deutschlands  1871
Nikolaus Otto          Taunus (De)    Miterfinder des Ottomotors             1876
Otto von Guericke      MD (De)        Erfinder der Luftpumpe                 1649
                                      Halbkugelversuch vor dem Kaiser        1654
Otto Normalverbraucher De             erlernt Autofahren                     1960
                                      erlernt eine Programmiersprache        2020
Diese Tabelle enthält eine Menge (m) von 6 Personen und für jede Person eine Wiederholgruppe (TAT, JAHR l)-eine Liste von (TAT, JAHR)-Paaren.

2. Metadaten

Programm 1: Gib mir die Metadaten der Tabelle ottos.tab.
aus ottos.tab
("meta" einschalten und "tab" clicken)
Das Ergebnis ist eine vollständige TTD:
TABMENT! OTTOS
OTTOS! M(NAME,GEBORENIN,L(TAT,JAHR))
NAME GEBORENIN TAT! TEXT
JAHR! ZAHL
TABMENT ist ein Kunstwort aus TABelle und dokuMENT. Es beschreibt den Typ der aktuellen Tabelle. TTD kürzt „Tabment Typ Definition“ ab. Wenn im Folgenden die Ergebnisse als TAB-Datei angesehen werden sollen, ist "meta" auszuschalten. Alle folgenden Beispiele bestehen aus sequentiellen Programmen. Sie beginnen mit einer Tabelle (des aus-Teils) und die Operation jeder neuen Zeile wird auf das Ergebnis der vorangehenden Zeile angewandt.

3. Beispielprogramme

3.1 „Hallo Welt“- Spielerei

Programm 2: Gib zwei Worte aus.
Hallo Welt
Das Ergebnis ist eine Liste von Wörtern (WORTl).
Programm 3: Gib ein Paar von zwei Worten aus.
Hallo, Welt

Das Komma trennt Komponenten von Tupeln. Ein Tupel (das Paar ist ein 2-Tupel) wird in der Regel horizontal ausgegeben und Elemente von Kollektionen (Listen, Mengen, Multimengen) in der Regel vertikal. Um Platz zu sparen werden in einfachen Situationen Kollektionen auch horizontal ausgegeben.
Programm 4: Gib einen Text mit Leerzeichen aus.
"Hallo Welt"

Programm 5: Verbinde zwei Wörter.

Hallo +text Welt # +text: Verbindung (Konkatenation) von Texten
# leitet den Zeilenkommentar ein.
Programm 6: Gib einen Gruß mit einer Liste von Worten aus.
ext GRUSS:=[Hallo Welt]
ext = Extension; Erweiterung der leeren Tabelle um eine Spalte. Das Ergebnis sind zwei Worte.
Programm 7: Gib zwei Worte mit zwei Spaltennamen aus.
ext LIEBER:=Hallo
ext GRUSS:=Welt

Das Ergebnis ist ein Paar (2-Tupel) von einspaltigen Tabellen.
Programm 8: Gib einen Text mit einem Tag (Spaltennamen) aus.
ext GRUSS:=“Hallo Welt“
Programm 9: Sortiere eine Menge von Wörtern.
ext GRUSS:={Welt Hallo}
Mengen und Multimengen werden stets sortiert; die Reihenfolge der Elemente bleibt bei Listen bestehen.

3.2 Selektion a la Google

Programm 10: Gib alle Personen, die das Wort Lechfeld enthalten.
aus ottos.tab
avec Lechfeld

3.3 Präzisierte Selektion

Programm 11: Gib mir alle Daten über die Person(en) Guericke.
aus ottos.tab
avec Guericke in NAME

Spaltennamen enthalten in o++oPS-Programmen keine Kleinbuchstaben. Enthält ein Wort einen Kleinbuchstaben so wird es als Text (String) gewertet. Soll der Text Leerzeichen enthalten, so muss er in Hochkomma geschrieben werden z.B. “Otto von Guericke“. "in": jedes Wort der linken Seite kommt in der rechten Seite vor. Klein und Großschreibung findet hierbei keine Berücksichtigung.
Programm 12: Gesucht sind alle in Deutschland Geborenen.
aus ottos.tab
avec De in GEBORENIN
Programm 13: Gesucht sind alle Nichtadligen.
aus ottos.tab
sans Von in NAME

3.4 Umstrukturierung

Programm 14: Gesucht sind alle Taten von Otto dem Großen.
aus ottos.tab
avec “otto der Grosse“ in NAME
gib TATl
Programm 15: Gib zu jedem Jahr alle Taten mit Namen.
aus ottos.tab
gib JAHR,(TAT, NAME l)m

Mit "gib" kann beliebig umstrukturiert werden. Der Nutzer kann ein beliebiges Schema oder eine ganze TTD angeben. Die Daten werden nach Jahr sortiert. Neben Mengen (m), werden auch Multimengen (b=bag) sortiert. Durch "mv(A1,A2,...)" und "bv(A1,A2,...)" wird nach A1,A2,.. abfallend sortiert. Bei Listen (l) verbleibt die Inputreihenfolge und mit lv wird die Reihenfolge umgekehrt.

3.5 Spalten vergessen (wegnehmen)

Programm 16: Gib alle Daten vom 19.ten Jahrhundert ohne die Spalte Jahr.
aus ottos.tab
avec JAHR >= 1800 & JAHR < 1900
weg JAHR

3.6 Aggregationen in verschiedenen Quellebenen

Programm 17: Wie viele Personen und wie viele Taten enthält die Datei ottos.tab.
aus ottos.tab
gib ANZPERS, ANZTAT ANZPERS!cnt NAME ANZTAT! cnt TAT

3.7 Aggregationen ohne GroupBy in mehreren Zielebenen

Programm 18: Gesucht sind die Anzahl der Personen und für jedes Jahrhundert und die Anzahl der Taten.
aus ottos.tab
ext JAHRH:=JAHR : 100 zahl +1
gib ANZ_PERS,(JAHRH,ANZ_TAT m) ANZ_PERS! cnt NAME
    ANZ_TAT! cnt TAT
Durch vier Leerzeichen am Anfang einer Zeile wird diese mit der vorangehenden Zeile zu einer logischen Einheit (eine Zeile) verbunden.

3.8 Selektion ohne Having

Programm 19: Gesucht sind alle Personen mit mehr als 2 Taten.
aus ottos.tab
mit TATl cnt > 2
Programm 20: Gesucht sind zu jedem Jahrhundert die 2 letzten Taten.
aus ottos.tab
ext JAHRH:=JAHR : 100 zahl +1
gib JAHRH,(JAHR,TAT b) m
avec JAHR! JAHR pos- < 3

3.9 Vorwärtsrekursion

Programm 21: In wie vielen Jahren verdoppelt sich die Wirtschaftskraft bei einem Wachstum von einem Prozent.
0 bis 100 tag1 JAHR
rec BETRAG:= first 1. next BETRAG pred*1.01 at JAHR
mit BETRAG <= 2
"rec"=recursive Erweiterung;
"pred"=predecessor=Vorgänger.
Der erste Ausdruck (1.) ist der Wert des ersten Jahres (0). Der zweite Ausdruck (BETRAG pred*1.01) berechnet die restlichen Werte jeweils aus den Vorgängerwerten.

3.10 Unäre Zahlen

Programm 22: Vier Enkel bekommen je drei Äpfel. Wie viele Äpfel benötigt man?
aus [KIND! Ernst Clara Ulrike Sophia]
ext [APFEL! | | |] at KIND # "ext"=Extension=Erweiterung
cnt APFEL

Neben den grundlegenden elementaren Datentypen TEXT, WORT, BOOL (2 Wahrheitswerte si und no), ZAHL (ganze Zahlen) PZAHL (Kommazahlen aber mit Punkt (.) geschrieben) gibt es noch den Datentyp BAR, der nur ein Element-den Strich (|)- enthält.
Programm 23: (3+4)*5
aus [X! | | |] , [X! | | | |]
ext [Y! | | | | |] at X
cnt Y

3.11 Gewichteter Durchschnitt

Programm 24: Gesucht ist der Durchschnitt der Noten und ein gewichteter Durchschnitt aller Noten (einschließlich Klausurnoten K1 und K2) sowie der gewichtete Durchschnitt pro Fach.
NAME, (FACH,    KlAUl,  NOTEl l)m
Paul   Mathe    1 3     1 4
       Kunst    2 2     1 3 2 1 1
                        1 4 4 1
Emma   Mathe    1 4     3 2 4 2
# ext DUR:= KLAUl,NOTEl ++:
# ext GEWICHTETER_DUR := KLAUl ++:*0.6 + (NOTEl ++: *0.4)
gib FACH, GDUR m GDUR! ++: KLAUl ++:*0.6 + (NOTEl ++: *0.4)
rnd 2 # alle Zahlen werden 2 Stellen nach dem Komma gerundet

Es ist klar, dass der gewichtete Durchschnitt nur korrekt ist, wenn beide Klausurnoten vorhanden sind. Solange das nicht erfüllt ist, muss sich der Nutzer mit dem einfachen Durchschnitt oder einem Durchschnitt mit einer Klausurnote zufrieden geben. Letzterer erfordert auch mindestens eine Note sowie die erste Klausurnote.

3.12 Auswertung von Bankkonten

Programm 25: Wie viel habe ich 2013 und wie viel 2014 für Elektrizität bezahlt.
aus umsatz2013.csv, XX:=umsatz2014.csv
mit Strom
gib KOSTEN13,KOSTEN14 KOSTEN13! ++ UMSATZ2013/BETRAG
    KOSTEN14! ++ XX/BETRAG

Durch das Komma im aus-Teil werden die beiden Tabellen nicht verbunden sondern nebeneinander gestellt, so dass bei Sparkassendateien folgende TTD entsteht:
TABMENT: UMSATZ2013,XX
UMSATZ2013, XX: (....,VERWENDUNGSZWECK,..., BETRAG,...l)
VERWENDUNGSZWECK,...: TEXT
BETRAG: PZAHL

3.13 Verbinden von Tabellen

Die beiden folgenden Programme beziehen sich auf 2 flache (relationale) Studententabellen der folgenden Typen:
students1.tab: STID, NAME, LOC?, SAL, DEPT m
exams1.tab: STID, COURSE, MARK l
Programm 26:Gesucht sind alle Studenten, die das Wort Algebra enthalten, mit allen ihren Prüfungen.
aus students1.tab
ext exams1.tab at DEPT
avec STUDENTS1/STID=EXAMS1/STID
weg EXAMS1/STID
avec Algebra in EXAMS1

Nach dem Entfernen der redundanten Spalte STID (weg) hat das aktuelle Tabment folgende TTD:
TABMENT: STUDENTS1
STUDENTS1: STID,NAME,LOC?,SAL,DEPT,EXAMS1 m
EXAMS1: COURSE,MARK l
MARK,STID: ZAHL
COURSE,DEPT,NAME,LOCATION,SEX: TEXT
Programm 27: Gesucht sind alle Studenten, die Algebra mit 1 belegt haben, mit allen Kursen, die sie belegt haben.
aus students1.tab
ext begin aus exams1.tab; mit STID=STID'; weg STID end at DEPT
avec STID! (Algebra,1) in EXAMS1
Nach der Erweiterung „ext“ hat das aktuelle Tabment die gleiche TTD wie die oben angegebene. Innerhalb von Unterprogrammen, die durch die Klammern „ begin end“ angezeigt werden, kann man sich durch „'“ auf die äußeren Spaltennamen beziehen. „in“ ist insbesondere die Elementrelation und mengentheoretische Inklusion (Teilmengen- bzw. Teilkollektionsrelation).

3.14 Generierung eines kleinen Bildes

Programm 28: Generiere Punkte der Sinusfunktion und der Ableitung im Intervall [-4,4]. Füge die X-Achse mit 7 ganzzahligen Strichen ein.
aus 4, bisschritt 4,0.01 tag1 X
ext SINE:= X sin
ext ABLEITUNG:=(X+0.001 sin- (X sin : 0.001)
ext Y:=0 at X
ext 3- bis 3 tag1 X2;
ext 0.05- bisschritt 0.05,0.01 tag1 Y2 at X2

Das "ext", das X2l einführt, kann auch durch ein Komma ersetzt werden. Damit die Punkte gesetzt werden, muss man "bild" anklicken.

4. Literatur