Programmieren lernen mit Lua: Lektion 01: Zahlen, Texte und Bezeichner

Übersicht | Vorherige Lektion | Nächste Lektion





Der interaktive Modus

Lua ist eine interpretierte Programmiersprache. Der Lua Interpreter ist dafür zuständig, die Codebefehle umzusetzen – etwa, um zwei Zahlen zu addieren oder eine Nachricht auszugeben. Diese Befehle können in einer Textdatei stehen. Es besteht aber auch die Möglichkeit, direkt mit dem Interpreter zu kommunizieren wie in einem Chat: Ihr gebt eine Codezeile ein, drückt Enter und erhaltet das Ergebnis. Diese Arbeitsweise nennen wir den interaktiven Modus. In der ersten Lektion werden wir ausschließlich den interaktiven Modus verwenden.

Lua auf repl.it starten

Zuerst öffnet ihr über diesen Link ein leeres Lua Projekt und seht dann folgendes:

Mit einem Klick in das Fenster startet ihr den Lua Interpreter und landet auf der Konsole. Dort tippt ihr Lua-Befehle ein, bestätigt diese mit Enter und erhaltet postwendend das Ergebnis:

Falls ihr bereits bei repl.it angemeldet seid, könnt ihr auch ein eigenes Lua Projekt anlegen. Das funktioniert über einen Klick auf den Plus-Button auf der Startseite oben rechts. Anschließend werdet ihr gefragt, welche Programmiersprache ihr für euer Projekt nutzen wollt – neben Dutzenden anderen Kandidaten wie Java, C oder Ruby könnt ihr dort auch Lua auswählen. Ein eigenes Lua-Projekt sieht für angemeldete Nutzerinnen so aus – die Konsole findet ihr auf der rechten Seite:

Erste Schritte

Für alle hier wiedergegebenen Beispiele aus interaktiven Sitzungen gilt: Jene Zeilen, die mit > beginnen, sind Eingaben, die anderen Zeilen sind die Antworten des Lua Interpreters.

Rechnen

Selbstverständlich beherrscht Lua die Grundrechenarten. Schaut euch die folgenden Beispiele an, probiert sie aus und versucht auch eigene Aufgaben. Ihr seht an den folgenden Beispielen: Lua kennt negative Zahlen, und es erkennt, ob eine Zahl durch eine andere ohne Rest teilbar ist (28 / 7 ist 4) oder dies nicht möglich ist (10 / 3 ist 3.3333333333333). Das Beispiel zeigt auch: Lua verwendet einen Dezimalpunkt, kein Komma.

> 1 + 1
2

> 10 - 3
7

> 10 - 20
-10

> 7 * 8
56

> 28 / 7
4

> 10 / 3
3.3333333333333

> 3.141 * 2
6.282

Übrigens: Ihr könnt die Leerzeichen vor und nach den Rechenoperatoren (also +, -, * und /) auch weglassen, also 1+1 statt 1 + 1 schreiben. Es hat sich aber durchgesetzt, solche Ausdrücke mit Leerzeichen zu schreiben – es sieht in den meisten Situationen einfach schöner aus und ist besser lesbar.

Automatische Ausgabe des letzten Ergebnisses

Ihr habt in den ersten Beispielen schon gesehen: Der Lua Interpreter gibt im interaktiven Modus immer das Ergebnis der letzten Eingabe automatisch aus. Bei der Ausführung von Code-Dateien läuft das anders: Dann erledigt die Funktion print() die Ausgabe. Ihr könnt print() auch im interaktiven Modus nutzen:

> print(10)
10

> print(1 + 1)
2
Bezeichner

Anstatt mit Zahlen kann Lua auch mit Bezeichnern rechnen:

> a = 1
> b = 2
> a + b
3

Bezeichner (viele nennen sie auch Variablen, wir finden Bezeichner passender) sind Platzhalter für Werte. Genauer: Bezeichner verweisen auf Werte. Im letzten Beispiel steht a für den Wert 1 und b für den Wert 2. Wann immer im Code ein Wert stehen könnte – zum Beispiel eine Zahl in einer Addition – dürft ihr auch einen Bezeichner hinschreiben, der auf einen Wert verweist.

Bezeichner dürfen aus Buchstaben, Ziffern und Unterstrichen zusammengesetzt sein, dürfen jedoch nicht mit einer Ziffer beginnen. Zudem ist es in den meisten Fällen üblich, Bezeichner nur mit kleinen Buchstaben zu schreiben und zusammengesetzte Bezeichner mit Unterstrichen zu trennen – also lieber anzahl_raumschiffe statt AnzahlRaumschiffe. Mehrere Bezeichner können auf denselben Wert zeigen. Das demonstrieren wir weiter unten.

Wenn wir einen Bezeichner mit einem Wert verbinden (also zum Beispiel a = 1 schreiben), dann heißt das auch Zuweisung. Wenn wir einem Bezeichner zum ersten Mal in einem Programm einen Wert zuweisen (Zum Beispiel punkte = 0 zu Beginn eines Spiels), dann nennt man das auch Initialisierung.

Alle innerhalb einer interaktiven Lua Sitzung getroffenen Zuweisungen sind bis zum Ende der Sitzung gültig. Auf repl.it startet ihr eine neue Sitzung mit einem Druck auf den Run-Button.

Zeichenketten

Wenn ihr in Lua Zeichenketten (also Text) eingeben wollt, müsst ihr diese mit einfachen oder doppelten Anführungszeichen umschließen:

> "Lua find ich gut"
Lua find ich gut

> 'Heute ist ein schöner Tag'
Heute ist ein schöner Tag

Wenn ihr einfache Anführungszeichen zur Begrenzung der Zeichenkette verwendet, darf die Zeichenkette selbst auch doppelte Anführungszeichen enthalten – und umgekehrt:

> '"Lua" ist das portugiesische Wort für "Mond".'
"Lua" ist das portugiesische Wort für "Mond".

> "'Zeichenketten' werden auch 'Strings' genannt."
'Zeichenketten' werden auch 'Strings' genannt.

Zurück zum Thema Bezeichner. Es gibt viele Dinge, die mit verschiedenen Wörtern bezeichnet werden. Zum Beispiel nennen wir einen PKW auch Schlitten, Blechkiste, Auto oder Karre. Das lässt sich in Lua wie folgt abbilden. Bitte beachtet, dass hier schlitten (ohne Anführungszeichen) ein Bezeichner ist; "PKW" (mit Anführungszeichen) ist eine Zeichenkette.

> schlitten = "PKW"
> blechkiste = "PKW"
> auto = "PKW"
> karre = "PKW"

> schlitten
PKW
> blechkiste
PKW
> auto
PKW
> karre
PKW

Es ist wichtig zu verstehen, dass Bezeichner (wie in den vorherigen Beispielen a, b, schlitten oder blechkiste) keine Behälter sind, die Werte enthalten. Bezeichner verweisen auf Werte. Dieser Unterschied wird noch wesentlich werden, wenn es später um Werte geht, die ihren Zustand ändern können.


Verschiedene Bezeichner verweisen auf denselben Wert

Zeichenketten zusammenbauen

In Lua ist .. ein Operator, ähnlich wie +, - oder *. Mit ihm könnt ihr Zeichenketten verknüpfen. Das zeigt das nächste Beispiel:

> name1 = "Anna"
> name2 = "Peter"
> name1 .. " und " .. name2
Anna und Peter

name1 .. " und " .. name2 liefert hier eine neue Zeichenkette, die aus den mittels .. verknüpften Zeichenketten besteht. Genau so, wie 1 + 2 eine neue Zahl liefert, nämlich 3. Einen Codeabschnitt, der einen neuen Wert liefert, nennt man in der Informatik übrigens auch Ausdruck.

Mittels .. lassen sich auch Zeichenketten mit Zahlen verbinden. Das ist oft praktisch, wenn das Programm einen Wert in einer verständlichen und gut lesbaren Form ausgeben soll:

> temperatur = 18
> "Die Temperatur beträgt " .. temperatur .. " Grad Celsius."
Die Temperatur beträgt 18 Grad Celsius.
Datentypen

Ihr habt alle sicher schon oft gehört, dass Computer letztlich nur Nullen und Einsen speichern können. Woher soll der Computer also wissen, ob eine bestimmte Folge von Nullen und Einsen eine Zahl, eine Zeichenkette oder sonstwas sein soll? Genau das sagen ihm die sogenannten Datentypen. Die Funktion type() verrät den Typen eines Wertes. Zeichenketten und Zahlen habt ihr bereits kennengelernt. Die entsprechenden Typen heißen string und number:

> type("hallo")
string
> type(3.14)
number

In Lua sind auch Funktionen Werte. Sie haben den Typ function:

> type(print)
function
> type(type)
function
Der spezielle Datentyp nil

Wenn ihr einen Bezeichner verwendet, dem kein Wert zugewiesen wurde (= der auf keinen Wert zeigt), dann hat dieser den Wert nil. Die Bezeichnung nil kommt von dem lateinischen „nihil“ und bedeutet „Nichts“. nil ist auch ein Datentyp! Den Nutzen des Wertes und Datentyps nil wird in der nächsten Lektion deutlich.

> print(x)
nil
> type(x)
nil

Ihr könnt einem Bezeichner auch den Wert nil zuweisen und somit die vorherige Zuweisung löschen:

> x = 10
> print(x)
10
> x = nil
> print(x)
nil

Ihr habt bis jetzt folgende Datentypen kennengelernt:

string
number
function
nil

In den nächsten Lektionen werden wir noch folgende weitere Datentypen vorstellen:

boolean
table

Aufgabe 1.1 Stell Dir vor, Du möchtest Bonbons verkaufen. Du weißt, wie viele Bonbons Du verkaufen willst und wie viel ein Bonbon kostet. Daraus möchtest Du den Gesamtpreis berechnen. Speichere dafür eine ganze Zahl (zum Beispiel 7) unter dem Bezeichner anzahl_bonbons und eine weitere Zahl (wie 0.19) unter dem Bezeichner stueckpreis.
Berechne den Gesamtpreis und speichere ihn unter dem Bezeichner gesamtpreis. Gib Das Ergebnis aus.


> anzahl_bonbons = 7
> stueckpreis = 0.19
> gesamtpreis = anzahl_bonbons * stueckpreis
> print(gesamtpreis)
1.33


Aufgabe 1.2 Gib dem Bezeichner anzahl_bonbons einen neuen Wert (zum Beispiel 9) und berechne den Gesamtpreis erneut und gib ihn aus.


> anzahl_bonbons = 9
> gesamtpreis = anzahl_bonbons * stueckpreis
> print(gesamtpreis)
1.71


Aufgabe 1.3 Gib den Gesamtpreis in einer schöneren Form aus:

9 Bonbons kosten 1.71 Euro.

Du kannst hierfür Zeichenketten und Zahlen mit .. verbinden.


> print(anzahl_bonbons .. " Bonbons kosten " .. gesamtpreis .. " Euro.")
9 Bonbons kosten 1.71 €.


Was wir hier ausgelassen haben

Dieser Kurs versteht sich als Rundgang durch die Sprache Lua. Vieles können wir daher nicht eingehend behandeln, liefern aber am Ende einer jeden Lektion Nachschlag und skizzieren ein paar weitere Themen.

Der Gültigkeitsbereich von Bezeichnern

Die Bezeichner, so wie wir sie in allen Beispielen dieses Kurses verwenden, sind global gültig. Das bedeutet, dass sie an jeder Stelle des Programms sichtbar sind. Das ist für die kleinen Programmbeispiele in diesem Kurs kein Problem. Bei größeren Projekten ist globale Sichtbarkeit ein No-Go. Stellt euch vor, sämtlicher Funkverkehr von Feuerwehr, Rettungsdiensten und Polizei einer Großstadt würde über den selben Kanal gehen. Ein ähnliches Chaos wird in einem großen Programm passieren, in dem alle Bezeichner global sind. Es kann und wird passieren, dass an verschiedenen Stellen des Programms identische Bezeichner für unterschiedliche Dinge verwendet werden. Und das führt zu rätselhaften und schwer verständlichen Fehlern. Das Schlüsselwort local vor der Initialisierung eines Bezeichners sorgt für lokale Gültigkeit:

local temperatur = 18
io.read() statt print()

Die Funktion print() springt nach der Ausgabe immer auf eine neue Zeile. Wenn ihr wollt, dass das nicht passiert, verwendet die Funktion io.write(). Damit lassen sich zum Beispiel schönere Dialoge und Ascii-Grafiken bauen. Nebenbei bemerkt lassen sich mit io.write() auch Textdateien schreiben – indem man den Ausgabestrom von der Konsole auf eine Datei umlenkt. Ebenso könnt ihr io.read() zum Lesen einer Datei verwenden. Auch dieses Thema hat in dieser Einführung keinen Platz gefunden.

Navigation

Übersicht

Vorherige Lektion

Nächste Lektion


Wir bedanken uns bei der Peakboard GmbH für die freundliche Unterstützung bei der Entwicklung dieses Kurses.

Peakboard ist eine All-in-One-Lösung aus Soft- und Hardware, mit der Du Daten aus unterschiedlichen Datenquellen erhebst, auswertest und in Echtzeit auf Bildschirmen visualisierst. Mit der kostenlosen Software, dem Peakboard Designer, gestaltest Du Dein individuelles Dashboard und bindest deine Datenschnittstellen an. Die Hardware, die Peakboard Box, verarbeitet und kommuniziert die Datenströme dezentral und damit ressourcenschonend direkt am Industriearbeitsplatz. Damit sorgst Du für mehr Transparenz und optimierst so ganz einfach deine Prozesse.