Hallo, ich begrüße Sie hier mit ganz herzlich zum letzten Teil
und das ist der zweite Teil für eine funktionale Programmierung,
nachdem wir uns mit den Grundlagen beschäftigt haben,
gesagt haben, warum brauchen wir das?
Warum ist das für uns interessant? Wollen wir uns jetzt
damit beschäftigen, wie funktioniert das tatsächlich? Dazu nehmen wir
die Programmiersprache Nikett. Reckett ist für uns etwas,
die Fragen, wenn wir dann wieder durchgehen,
Reckett ist eine sehr einfache Einstiegssprache und eine sehr einfache Umgebung
und deswegen ist sie gut geeignet für uns,
das als Beispiel
zu dienen
Und wir werden uns so nach und nach durch einige Sonntagselemente arbeiten.
Ich möchte gleich dazu betonen, dass wir ihnen hier wirklich nur
einen kleinen Vorgeschmack geben können. Ich möchte sie ermutigen,
versuchen Sie das selbst, probieren Sie weitergehende Sachen aus.
Wir können hier in dieser einen oder anderthalb Lehrveranstaltung nicht
so viel leider mit ihnen machen.
Lassen Sie uns starten mit Racket. Racket ist eine Programmiersprache,
die auf dem Landtag Kalkül basiert
Bus, so, jetzt haben wir einen Laserpointer auch. Ja,
und sie dient eigentlich dazu, oder man braucht sowas,
damit man nicht durch Disziplin diese Eigenschaften von Funktionalität,
wie Unveränderlichkeit oder sowas hinkriegt.
Natürlich kann man das irgendwie alles auch machen, wenn sich
alle genau dran halten. Das kriegen sie allein hin,
aber nicht in einem großen Projekt von 30 Leuten.
Da wird es immer jemanden geben, der es nicht richtig verstanden hat, jemand,
der weggeht. Jemand, wo sie gar nicht mitkriegen,
was der für Mist macht. Das heißt, es ist immer besser,
die Möglichkeiten, die Freiheiten dadurch so ein bisschen zu kanalisieren,
dass eine bestimmte Umgebung existiert und das wäre eine Entwicklungsumgebung,
eine Sprache, ein typisches System, ein Kakül.
In dem Fall verwenden wir ja eine Sprache auf der Basis von Lisblisb,
ist für diejenigen, die es zum ersten Mal sehen,
sind sie erstmal überrascht über diese Klammern und das ist die Zuweisung,
nicht in der Form gibt.
Genauso ist Drecket und das Ganze, die theoretische Basis davon ist Landa-Kalkül,
der Begriff Landa kommt natürlich hier vor und nahm,
das sind auch in Java übernommen worden,
das hatten wir ja schon mal gesagt und hier ist auch der Punkt,
wo wir dann sehen, ja,
es ist sinnvoll,
dass man mit Funktionen
wirklich arbeiten kann
Wir benutzen Dr. Reckett, das ist eine sehr nette Entwicklungsumgebung,
die uns erstaubt, einfache Ausdrücke direkt einzugeben.
Das sieht so aus, dass sie zwei Fenster haben,
sie könnten sich die deutsche Version und die englische Version haben.
Hier steht ja noch sechs, sieben,
wir haben jetzt die Version 7,
sieben und ebenfalls habe ich die auf meinem Rechner.
Und was besonders, also man wählt,
man führt etwas sofort gleich aus.
Ja, also man gibt hier unten etwas ein,
drückt Enter und dann steht gleich
das Ergebnis da
Hier oben können sie Definitionen vorgeben und dort können sie direkt Ausführung ausgibt.
Sie müssen eine Sprache vorher wählen, da gehen sie hier
oben rein und wählen eine Sprache auf dem Level, der funktioniert.
Also diese Beispiele funktionieren alle mit dem Einsteigerlevel,
den wir hier haben. Wir sollten einige Begriffe beachten,
die Unterschiede sind zu dem, was sie schon kennen.
Also das Programm ist ja nicht eine Folge von Anweisungen,
sondern hier ist es eine Menge von Funktionsdefinitionen.
Kann man ja schon fast vermuten bei der funktionalen Sprache.
Ein Ausdruck ist eine Kombination von solchen Funktionsausrufen und
wir haben relativ häufig der Berechnung den Begriff Auswertung
Weil wir etwas weniger des Berechnenden sind, sondern mehr das wird die Funktion auswerten.
Ja, gut, wir haben Werte. Klar,
es gibt verschiedene Datentypen, zu denen kommen wir gleich noch,
aber besonders unterschiedlich ist das Benutzung des Begriffs Variable.
Ja, es gibt keine Zuweisung zu solchen Mariablen,
sondern man nützt es eher wie das X in einer Variablen,
in einer mathematischen Funktion.
Ich brauche diesen Wert, aber ich kenne ihn erst mal nicht.
Ja, so, es ist nicht der Speicherplatz,
der auch mal das wechselt. Ich erkläre gerne Anfänger der Programmiersprache,
imperativen Programmiersprache, eine Variable wie so ein Schubkästchen,
damit sie das endlich vergessen, wie das in Mathematik ist.
Hier ist das X wie in der Mathematik. Der Wert
einer Variable kann erstmal nicht geändert werden, jedenfalls nicht innerhalb einer Umgebung.
Soweit, wir schauen uns gleich immer den Syntax an und
sprechen darüber, was man damit machen kann.
Lassen Sie uns auch trotzdem starten mit etwas grundlegenden Werte.
Das ist etwas, wo eigentlich nicht wirklich eine Auswertung passiert,
wo also die Auswertung schon,
das Ergebnis schon da ist und lasst es gleich gleich der Punkt für mich,
die elementaren Datentypen zu nennen.
Wir haben zunächst Zahlen, das ist keine Überraschung,
wir haben Wahrheitswerte, die werden mit diesen herrscht geschrieben,
Doppelkreuz, Two and False und Characters sind auch noch ein elementarer Datentyp.
Da haben wir dieses Escape-Zeichen davor, danach können sie ein Charakter schreiben.
Es gibt ein paar spezielle vordefinierte Characters und ansonsten,
wenn sie jeden Charakter über die Optalzahl des Aski-Zeichens erreichen.
Und die Auswertung, da gibt es natürlich keine,
deswegen sagt man, die werten zu sich selbst ausgewertet,
wenn sie das hinschreiben, gibt es den gleichen Wert.
Zurück. Starten wir gleich mal mit diesem,
was ich sagte, Klammern mit einem ganz einfachen Beispiel
die Addition
Wir haben so eine rekursive, eine umgekehrte Notation.
Wir müssen immer Klammern angeben. Wir machen den Operate-Defunktionen vorne
dran und dann kommen die Argumente.
Und die Argumente können wiederum Ausdrücke sein. Das Ganze ist
ein Ausdruck. Und man kann das irgendwie auswerten. Ja,
also wir können das hier auswerten, da können wir schon
raten, dass hier 491 rauskommt.
Ja, hier kommen zu der 491 nochmal, 301 dazu.
Und hier gibt es eine Fehlermeldung,
weil wir das tun und die 251
nicht addieren können
Ja, also nicht jede Funktion funktioniert mit jedem.
So, wie läuft die Auswertung genau? Also wir haben
so Zwischenwerte, die ich hier mal mit V1 bezeichnet habe.
Ja, also zunächst wird der erste Operant ausgewertet.
Da wird der zweite Operant ausgewertet, sorry, Argument,
das erste Argument, denn das zweite Argument ausgewertet.
Und wenn beide wirklich Zahlen sind, dann gibt das die Summe zurück.
Ansonsten gibt es eine Fehlermeldung. In Racket oder in den funktionalen Programmiersprachen
haben wir häufig dynamischer Typbindung. Erstmal, es gibt Typen,
ja, das müssen wir erstmal festlegen, das ist nicht frei.
Aber wir haben dynamisches Typbinden, das heißt,
oder Typ Prüfung, der Typ wird erst geprüft,
wenn wir es auswerten, weil dann geruft wird,
ob da eine Funktion dahinter steht.
Ja, also die Addition mit Plus benötigt zwei Zahlen,
hat die eben wenigstens schon genannt. Ja,
in Java ist das anders, bei Sitzer wechseln immer zu Java,
weil wir in Java ja bisher gearbeitet haben,
also da wird das vom Compiler zum Zeitpunkt der Übersetzung geprüft
Hier wird es zum Zeitpunkt der Ausführung geprüft.
Gibt ihnen natürlich mehr Möglichkeiten, gibt uns mehr Flexibilität,
aber natürlich auch Fehler treten erst später auf.
Wir wollen in Java bevorzugen, es ist durchaus,
dass wir statische Typ-Prüfung haben. Ja, arathmetische Ausdrücke,
ich hatte schon gesagt, rekursiv, weil wir immer wieder
Stücken weiter auswerten, erst wenn die Unterausdrücke ausgewertet.
Der Wert wird ermittelt und dann wird der komplette Ausdruck ausgewertet
Noch ein paar Sachen zu ausdrücken, ja,
dass ein Ausdruck kann ein Literal sein, literal ist ein endgültiger Wert,
der nicht mehr ausgewertet wird, also wie Two,
False, die Zahl oder wir hatten vorhin auch diese Charakter,
es gibt noch Listen und so weiter,
aber wir kommen gleich noch zu den Typen.
Es gibt eine ganze Menge Operationen und hier mal arithmetische Operationen,
klar, Zahlen gibt es auch.
Und ansonsten ist es immer so,
dass wir zuerst den Funktionsopperator haben und danach die Argumente in
so einer Klammer
Das ist diese Vitation. So, wenn wir
bedingte Ausdrücke haben, dann wäre sozusagen If die Funktion.
Und dann kommen die Argumente. Und dann wird zuerst E1 ausgewertet.
Der erste Ausdruck. Und wenn das nicht Folds ist,
also wenn es tue ist, dann werden die anderen Ast ausgewertet.
Da wird er zwei ausgewertet. Und wenn es False ist
, dann wird E3 ausgewertet. Also jetzt hier,
wenn etwas kleiner und neun ist,
dann wird das
so ausgewertet
Wir haben hier den Operator kleiner, ja,
und dann die Differenz hier zwischen 251 und 240.
Ein weiterer wichtiger Punkt ist, wie wir mit Namen umgehen.
Dazu gibt es dieses Konzept, Namen zu binden,
das passiert immer für eine Umgebung. Wir kommen gleich zu
der Umgebung. Ich kann mit die feinen einen Namen binden,
zum Beispiel eine Variable binden an eine Bezeichnung.
Und das kann Auch ein Ausdruck sein. So Funktionen spielen
ebenfalls eine ganz wichtige Rolle. Immer das machen wir.
Diese Namensbindung machen wir immer mit dem Defeien. Außerdem haben
wir noch die Möglichkeit, hier Bezeichner, Operationen und so weiter zu verwenden.
So zu den Variablen hatte ich schon kurz gesagt,
dass die Variablen ganz anders sind,
als sie das in Java vielleicht mühevoll gelernt haben,
je nachdem wie lange sie da schon drin sind.
Vielleicht sind sie schon länger drin,
dann ist das für sie,
Völlig normal. Wir müssen einfach wieder zurückgehen zu dem,
was sie vor Java gelernt haben,
bevor sie die erste Programmiersprache gelernt haben, waren sie der Meinung,
dass X ergibt sich zu X-Lash X plus 1,
das ist, was nicht funktioniert.
Wir sind wieder bei dieser Funktion,
bei diesem Wert von X, wie im mathematischen Formeln.
Ja, es ist ein Name für einen unbekannten Wert.
So, und was wird damit gemacht?
Da wird der Bezeichner wird in der aktuellen Umgebung gefunden und
der Wert wird zurückgegeben. Hier haben wir dieses Binden,
also in der Wert, an den Namen des Bezeichte,
der Variablen gebunden ist,
dieser Wert wird dann zurückgegeben
So ein Bezeichner darf keine Lehrzeichen enthalten, keine spezielle Zeichenkette enthalten.
Es muss klar sein, dass es keine Zahl ist.
Also nicht um 40, nicht erlaubt, aber 64 Bits ist erlaubt.
Es muss durch das, es ist auch nicht die Forderung,
dass von dran in Buchstaben steht oder so.
Es muss nur unterscheidbar sein. So,
jetzt noch dieser Punkt der Bindung,
den ich jetzt schon zweimal angerissen habe, mit dem die fein,
binde ich einen Ausdruck an einen Bezeichner.
Und das bezieht sich immer auf eine aktuelle Umgebung,
in lokale Umgebung. Das ist das, was zum
aktuellen Berechnungszeitpunkt da ist
Das ist für mich der Punkt,
wo ich zu den Fragen zurückgehe. Ich glaube,
die waren hier genau die Eigenschaften von Verwendung von Variablen in Reckett,
hatten wir gerade eben auf der Folie hier, nein,
das war auf der 42 war das.
Genau. Hier haben wir die Variablen und die 30,
sagte uns das auch,
wie wir Ausdrücke auswerten
Dynamische Typprüfung, genau das war das,
was wir eben hatten, ist die auf der Volley42 erklärt,
dass wir hier die Namensbindung haben und weil, jetzt war ich doch falsch.
Genau, hier war das mit der Reihenfolge,
was in Frage sechs gefragt wurde. Ja,
die Namensbindung an Funktionen, die nächste Frage,
das war, die Alia erläutert,
immer noch mal zurück zu den Fragen,
die lernen sich genug in Funktionen und wir kommen gleich
zur Umgebung