Sie sind auf Seite 1von 20

Lua - Erste Schritte in der Programmierung

Knut Lickert 7. Mrz 2007 a

Dieser Text zeigt einige einfache Lua-Anweisungen und welchen Eekt sie haben. Weitere Informationen oder eine aktuelle Version dieses Dokumentes gibt es bei http://lua.lickert.net

Inhaltsverzeichnis
1 Zeichenketten und deren Ausgabe in Lua 1.1 Zeilenumbrche . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . u 1.2 Sonderzeichen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2.1 Benannte Sonderzeichen . . . . . . . . . . . . . . . . . . . . . . . . 2 Operatoren 2.1 Grundrechenarten . . . . . . . . . . . . . 2.2 Vergleiche . . . . . . . . . . . . . . . . . . 2.3 Logische Operatoren . . . . . . . . . . . . 2.4 Geklammerte Logische Operationen . . . 2.5 Logische Operatoren mit Verneinung (not) 3 Variablen in Lua 2 2 4 4 5 5 5 7 7 7 8

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

4 Verzweigungen 9 4.1 If-Anweisung mit Else-Zweig . . . . . . . . . . . . . . . . . . . . . . . . . . 9 4.1.1 If mit verschiedenen Abfragen . . . . . . . . . . . . . . . . . . . . . 10 4.2 Case-Anweisung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 5 Schleifen 5.1 For-Schleifen . . 5.2 While-Schleifen . 5.3 Repeat-Schleife . 5.4 Schleifenabbruch 10 10 11 12 12

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

1 Zeichenketten und deren Ausgabe in Lua 6 Funktionen 12 6.1 Funktionen mit Parameter . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 7 Tabellen und Listen 15 7.1 Tabellen anlegen und fllen . . . . . . . . . . . . . . . . . . . . . . . . . . 15 u 7.2 Geschachtelte Tabellen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 7.3 Tabellen durchlaufen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 8 Beispiele mit regulren Ausdrcke a u 19 8.1 Patterns . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20

1 Zeichenketten und deren Ausgabe in Lua


Bildschirmausgaben erfolgen mit dem Kommando print. Klammern um die auszugebenden Ausdruck sind zu empfehlen1 Mehrere Parameter knnen duch Komma getrennt werden. o Strings knnen mit und deniert werden. o Beispielprogramm
1 2

print ( 1 : H e l l o World ) p r i n t ( 2 : H e l l o World ) Das Ergebnis: 1: Hello World 2: Hello World

1.1 Zeilenumbrche u
Zeilenumbrche werden mit \n oder \ und einem echten Zeilenumbruch eingefgt u u Beispielprogramm
1 2 3 4

print ( 1: Hello \ World ) print ( 2: Hello \ World ) Das Ergebnis: 1: Hello World 2: Hello World
1

Bei direkt folgendem String funktioniert es ohne, bei Variablen sind die Klammern zwingend

http://lua.lickert.net

2/20

1 Zeichenketten und deren Ausgabe in Lua Beispielprogramm


1 2

p r i n t ( 5 : H e l l o \n World ) p r i n t ( 6 : H e l l o \n World ) Das Ergebnis: 5: Hello World 6: Hello World In [ [ und ] ] geschachtelte Werte erlauben ebenfalls die Denition von Zeichenketten. Beispielprogramm

p r i n t [ [ H e l l o World ] ] Das Ergebnis: Hello World Beispielprogramm

1 2

p r i n t [ [ H e l l o World , you a r e s o n i c e today . ] ] Das Ergebnis: Hello World, you are so nice today. Mehrzeilige Eingaben sind mglich. o Beispielprogramm

1 2 3

print [ [ H e l l o World , you a r e s o n i c e today . ] ] Das Ergebnis: Hello World, you are so nice today. Zeilenumbruch direkt nach [[ wird geschluckt. Beispielprogramm

1 2 3

print [ [ H a l l o Welt , wie sch n b i s t du [ [ doch ] ] h e u t e ] ] o

http://lua.lickert.net

3/20

1 Zeichenketten und deren Ausgabe in Lua Das Ergebnis: Hallo Welt, wie schn bist du [[doch]] heute o Verschachtelte Denitionen sind mglich, innere Zeichenketten werden ubernommen. o

1.2 Sonderzeichen
Jedes Zeichen kann mit \ und dem Oktalwert2 des ASCII-Wertes des Zeichens deniert werden. 1.2.1 Benannte Sonderzeichen Jedes der Zeichen kann mit \ und dem Krzel generiert werden. u Zeichen Funktion Krzel u \a PC-Lautsprecher BEL \b Rcktaste, Backspace u BS \f Form Feed FF \n newline, neue Zeile LF \r carriage return CR \t (horizontal) Tabular HT \v vertical tab VT \\ Backslash \ single quote, einfaches Anfhrungszeichen u \ double quote, doppeltes Anfhrungszeichen u \[ left square bracket, eckige Klammer links \] right square bracket, eckige Klammer rechts Im folgenden Beispiel sind einige Teile auskommentiert, da diese keine sichtbare Ausgabe erzeugen (z.B. der PS-Pieps BEL). Beispielprogramm
1 2 3 4 5 6 7 8 9 10 11 12

- - p r i n t ( a , a ) - - p r i n t ( b , b ) - - p r i n t ( f , f ) - - p r i n t ( n , n ) - - p r i n t ( r , r ) - - p r i n t ( , ) - - p r i n t ( v , v ) p r i n t ( \\ , ) p r i n t ( \\ , \ ) p r i n t ( \\ , ) print ( \[ , \[ ) print ( \] , \] )
2

Bevor jemand lange suchen muss: Im ASCII Chart jeweils rechts unten (Quelle: http://dante.ctan. org/tex-archive/info/ascii.tex)

http://lua.lickert.net

4/20

2 Operatoren Das Ergebnis: [ [ ] ]

2 Operatoren
2.1 Grundrechenarten
Negative Zahlen werden mit einem vorgestellten - dargestellt. Binre Operatoren: a Operator Beschreibung Beispiel + Addition a=b+c Subtraktion a=b-c (negatives Vorzeichen) * Multiplikation a=b*c / Division a= b / c Potenzierung a = bc Beispielprogramm
1 2 3 4 5

print ( print ( print ( print ( print (

2 2 2 2 2

+ /

3 3 3 3 3

= = = = =

, , , , ,

2 2 2 2 2

+ * /

3 3 3 3 3

) ) ) ) )

Das Ergebnis: 2+3=5 2 - 3 = -1 2*3=6 2 / 3 = 0.66666666666667 23=8

2.2 Vergleiche
= = Gleichheit = Ungleichheit < Kleiner <= Kleiner gleich > Grer o

http://lua.lickert.net

5/20

2 Operatoren >= Grer gleich o Beispielprogramm


1 2 3 4 5 6

print ( print ( print ( print ( print ( print (

2 2 2 2 2 2

== = > < >= <=

3 3 3 3 3 3

, , , , , ,

2 2 2 2 2 2

== = = =

3 3 3 3 3 3

) ) ) ) ) )

Das Ergebnis: 2 == 3 false 2 = 3 true 2 3 false 2 3 true 2 = 3 false 2 = 3 true Beispielprogramm


1 2 3 4 5 6

print ( print ( print ( print ( print ( print (

A A A A A A

== = > < >= <=

B B B B B B

, , , , , ,

A A A A A A

== = = =

B B B B B B

) ) ) ) ) )

Das Ergebnis: A == B false A = B true A B false A B true A = B false A = B true Beispielprogramm


1 2 3 4 5 6

print ( print ( print ( print ( print ( print (

a a a a a a

== = > < >= <=

A A A A A A

, , , , , ,

a a a a a a

== = = =

A A A A A A

) ) ) ) ) )

http://lua.lickert.net

6/20

2 Operatoren Das Ergebnis: a == A false a = A true a A true a A false a = A true a = A false

2.3 Logische Operatoren


not Logisches Nein and Logisches und or logisches or Beispielprogramm
1 2

p r i n t ( t r u e and f a l s e = , t r u e and f a l s e ) p r i n t ( t r u e o r f a l s e = , t r u e o r f a l s e ) Das Ergebnis: true and false = false true or false = true

2.4 Geklammerte Logische Operationen


Beispielprogramm
1

2 3

p r i n t ( t r u e o r f a l s e and f a l s e = , t r u e o r f a l s e and f a l s e ) p r i n t ( t r u e o r ( f a l s e and f a l s e ) = , t r u e o r ( f a l s e and f a l s e ) ) p r i n t ( ( t r u e o r f a l s e ) and f a l s e = , ( t r u e o r f a l s e ) and f a l s e ) Das Ergebnis: true or false and false = true true or (false and false) = true (true or false) and false = false

2.5 Logische Operatoren mit Verneinung (not)


Beispielprogramm

http://lua.lickert.net

7/20

3 Variablen in Lua print ( print ( print ( print ( print ( print ( not t r u e and f a l s e not ( t r u e and f a l s e ) t r u e and not f a l s e not t r u e o r f a l s e not ( t r u e o r f a l s e ) t r u e o r not f a l s e = , = , = , = , = , = , not t r u e and f a l s e ) not ( t r u e and f a l s e ) ) t r u e and not f a l s e ) not t r u e o r f a l s e ) not ( t r u e o r f a l s e ) ) t r u e o r not f a l s e )

1 2 3 4 5 6

Das Ergebnis: not true and false = false not (true and false) = true true and not false = true not true or false = false not (true or false) = false true or not false = true

3 Variablen in Lua
Variablen mssen nicht deklariert werden, sie werden bei Bedarf erzeugt. u Variablen sind nicht Typgebunden, der Typ ist implizit vom Wert den sie vertreten deniert. Wird der Wert gendert, ndert sich der Typ der Variable. a a Variablen sind global, auer sie werden als lokal deniert. Nheres dazu bei Funka tionen. Werte knnen folgende Typen annehmen: o Nil (Zugleich der Wert von nicht angelegter Variablen) Zahlen Literale (Zeichen, Buchstaben, Wrter, etc.) o Boolean (wahr/falsch bzw. true/false) Tabellen Funktionen (Spezialfall eines Blocks) Beispielprogramm
1 2 3

p r i n t ( var ) var = H e l l o World p r i n t ( var ) Das Ergebnis: nil Hello World

http://lua.lickert.net

8/20

4 Verzweigungen Undenierte Variablen ergeben nil Zuweisung erfolgt mit = Beispielprogramm


1 2 3

p r i n t ( var1 , var2 ) var1 , var2 = 1 , 4 p r i n t ( var1 , var2 ) Das Ergebnis: nil nil 14 Mehrfachzuweisungen sind mglich. o

4 Verzweigungen
4.1 If-Anweisung mit Else-Zweig
Beispielprogramm
1 2 3 4 5 6

a = 1 i f a == 1 then print ( a i s t eins ) else p r i n t ( a i s t n i c h t e i n s s onde rn , a ) end Das Ergebnis: a ist eins Beispielprogramm

1 2 3 4 5 6

a = 999 i f a == 1 then print ( a i s t eins ) else p r i n t ( a i s t n i c h t e i n s s onde rn , a ) end Das Ergebnis: a ist nicht eins sondern 999

http://lua.lickert.net

9/20

5 Schleifen 4.1.1 If mit verschiedenen Abfragen Beispielprogramm


1 2 3 4 5 6 7 8 9

a = 2 i f a == 1 then print ( a i s t eins ) e l s e i f a == 2 then p r i n t ( a i s t zwei ) else p r i n t ( a i s t nicht e i n s oder zwei ) print ( a i s t , a) end Das Ergebnis: a ist zwei

4.2 Case-Anweisung
Eine Case-Anweisung existiert nicht, es mu durch if-elseif-Anweisungen simuliert werden.

5 Schleifen
5.1 For-Schleifen
Parameter der For -Anweisung: 1. Startwert 2. Endwert 3. Inkrement Beispielprogramm
1 2 3

f o r v a r i a b l e = 0 , 1 0 , 2 do print ( variable ) end Das Ergebnis: 0 2 4 6 8 10

http://lua.lickert.net

10/20

5 Schleifen Beispielprogramm
1 2 3

f o r v a r i a b l e = 0 , 1 , . 5 do print ( variable ) end Das Ergebnis: 0 0.5 1 Die Schleifenwerte mssen nicht ganzzahlig sein. u Beispielprogramm

1 2 3

f o r v a r i a b l e = 0 , 1 , . 5 do print ( variable ) end Das Ergebnis: 0 0.5 1 Ein Herunterzhlen funktioniert ebenfalls. a Fr Tabellen existiert eine Variante der For -Schleife. u

5.2 While-Schleifen
Beispielprogramm
1 2 3 4 5

i = 1 while i

= 5 do print ( i ) i = i + 1

end Das Ergebnis: 1 2 3 4 5 Anfangsbedingte Schleife Ist die Bedingung am Anfang nicht erfllt, wird kein Block durchlaufen. u

http://lua.lickert.net

11/20

6 Funktionen

5.3 Repeat-Schleife
Beispielprogramm
1 2 3 4 5

i = 1 repeat print ( i ) i = i + 1 until i 5 Das Ergebnis: 1 2 3 4 5 Endbedingte Schleife Mindestens ein Durchlauf des Blockes

5.4 Schleifenabbruch
Sollen Schleifen vorzeitig abgebrochen werden, kann Break verwendet werden. Beispielprogramm
1 2 3 4 5 6 7

f o r v a r i a b l e = 1 , - 1 , - . 5 do i f v a r i a b l e == 0 then print Null e r r e i c h t break end print ( variable ) end Das Ergebnis: 1 0.5 Null erreicht

6 Funktionen
Beispielprogramm
1 2

f u n c t i o n Test ( ) p r i n t ( H a l l o Welt )

http://lua.lickert.net

12/20

6 Funktionen end Test ( ) Das Ergebnis: Hallo Welt Beispielprogramm


1 2 3 4 5

3 4 5

function test () r e t u r n H a l l o Welt end print ( test () ) Das Ergebnis: Hallo Welt Rckgabewerte werden mit return angegeben. u Beispielprogramm

1 2 3 4 5 6 7

function test () r e t u r n H a l l o , Welt end v1 , v2 = t e s t ( ) p r i n t ( v1 ) p r i n t ( v2 ) Das Ergebnis: Hallo Welt Mehrfache Rckgabewerte sind mglich. u o Beispielprogramm

1 2 3 4 5 6

function test () r e t u r n H a l l o , Welt end v = test () print ( v ) Das Ergebnis: Hallo

http://lua.lickert.net

13/20

6 Funktionen Werden mehrere Werte zurckgegeben, aber nicht entgegengenommen, dann werden die u zustzlichen Werte geschluckt. a

6.1 Funktionen mit Parameter


Beispielprogramm
1 2 3 4 5 6

f u n c t i o n summe( v1 , v 2 ) return ( v1 + v2 ) end p r i n t ( summe( 1 , 2 ) ) p r i n t ( summe( 2 , 3 ) ) Das Ergebnis: 3 5 Parameter beginnen laut Konvention mit Beispielprogramm

1 2 3 4 5 6 7 8 9

a = vorher f u n c t i o n summe( v1 , v 2 ) a = v1 + v2 return a end p r i n t ( summe( 1 , 2 ) ) print ( a ) print ( v1 ) Das Ergebnis: 3 3 nil Parameter sind lokal deniert. Sonstige Variablen sind global deniert. Beispielprogramm

1 2

a = vorher f u n c t i o n summe( v1 , v 2 )

http://lua.lickert.net

14/20

7 Tabellen und Listen l o c a l a = v1 + v2 return a end p r i n t ( summe( 1 , 2 ) ) print ( a ) print ( v1 ) Das Ergebnis: 3 vorher nil Werden Variablen mit local deniert, sind sie nur innerhalb des Blockes verfgbar. u

3 4 5 6 7 8 9

7 Tabellen und Listen


Lua-Tabellen sind Datenstze.3 a Im Gegensatz zum gewohnten Tabellenbegri sind sie keine Tabellen mit mehreren Zeilen und Spalten, sondern zweispaltige Tabellen mit Schlssel und Wert. u Schlssel u Wert name Gdel o Geburtsjahr 1906 Todesjahr 1978

7.1 Tabellen anlegen und fllen u


Beispielprogramm
1 2 3 4 5 6 7

g o e d e l = g o e d e l . name = Kurt G del o g o e d e l . g e b u r t s j a h r = 1906 goedel . todesjahr = 1978 print ( goedel ) p r i n t ( g o e d e l . name ) Das Ergebnis: table: 00329E38 Kurt Gdel o Felder knnen an eine Tabelle angehngt werden. o a
3

In Pascal ein Record, in Ruby ein Hash,...

http://lua.lickert.net

15/20

7 Tabellen und Listen Tabellenname und Feldname sind durch einen Punkt getrennt. Beispielprogramm
1 2 3 4 5 6 7 8

goedel = name = Kurt G del , o g e b u r t s j a h r = 1906 , todesjahr = 1978 , print ( goedel ) p r i n t ( g o e d e l . name ) Das Ergebnis: table: 00329E38 Kurt Gdel o Felder knnen beim Anlegen schon gefllt werden. o u Komma nicht vergessen! Beispielprogramm

1 2 3 4 5 6 7 8 9 10

g o e d e l = g o e d e l . name = Kurt Goedel g o e d e l . g e b u r t s j a h r = 1906 goedel . todesjahr = 1978 g o e d e l [ 1 ] = Uber d i e V o l l s t n d i g k e i t d e r Axiome d e s l o g i s c h e n F u n k t i o n e n k a l k a g o e d e l [ 2 ] = D i s k u s s i o n z u r Grundlegung d e r Mathematik , E r k e n n t n i s print ( goedel ) p r i n t ( g o e d e l . name ) print ( goedel [ 1 ] ) Das Ergebnis: table: 00329E38 Kurt Goedel Uber die Vollstndigkeit der Axiome des logischen Funktionenkalkls. a u Als Schlsselwerte sind auch Zahlen mglich. u o Zahlen als Schlssel sind in eckigen Klammern. u Dieser Mechanismus ermglicht die Denition von Listen. o Beispielprogramm

http://lua.lickert.net

16/20

7 Tabellen und Listen g o e d e l = o g o e d e l . name = Kurt G del print ( goedel ) p r i n t ( g o e d e l . name ) p r i n t ( g o e d e l [ name ] ) Das Ergebnis: table: 00329E38 Kurt Gdel o Kurt Gdel o Statt der .Feldname-Methode kann auf Inhalte mit [feldname] erfolgen In den eckigen Klammern kann ein Ausdruck stehen (z.B. Variable mit dem Feldnamen)

1 2 3 4 5 6

7.2 Geschachtelte Tabellen


Tabellenwerte knnen wieder Tabellen sein. o Beispielprogramm
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

g o e d e l = g o e d e l . name = Kurt G del o goedel . geburt = goedel . geburt . jahr g o e d e l . g e b u r t . monat = 4 goedel . geburt . tag goedel . gestorben goedel . gestorben . jahr g o e d e l . g e s t o r b e n . monat goedel . gestorben . tag print ( print ( print ( print (

= 1906 = 28 = = 1978

= 1 = 14

goedel ) g o e d e l . name ) goedel . geburt ) goedel . geburt . jahr )

Das Ergebnis: table: 00329E38 Kurt Gdel o table: 00329FE8 1906

http://lua.lickert.net

17/20

7 Tabellen und Listen

7.3 Tabellen durchlaufen


Die For-Schleife ermglicht ein durchlaufen von Tabellen. o for schluessel, wert in pairs(table) do -- Block end schluessel enthlt den Feldnamen, bzw. bei Listen die Position. a wert enthlt den Wert. a Beispielprogramm
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

p e r s o n e n = personen [ 1 ] = name = Kurt G del , o g e b u r t s j a h r = 1906 , todesjahr = 1978 , personen [ 2 ] = name = Maurits C o r n e l i s Escher , g e b u r t s j a h r = 1898 , todesjahr = 1972 , f o r v a r i a b l e , p e r s o n i n p a i r s ( p e r s o n e n ) do p r i n t ( v a r i a b l e , p e r s o n . name ) end Das Ergebnis: 1 Kurt Gdel o 2 Maurits Cornelis Escher Eine Alternative Syntax ist: for schluessel, wert in next, table do -- Block end Beispielprogramm

1 2 3 4

p e r s o n e n = personen [ 1 ] = name = Kurt G del , o g e b u r t s j a h r = 1906 ,

http://lua.lickert.net

18/20

8 Beispiele mit regulren Ausdr cke a u todesjahr = 1978 ,

5 6 7 8 9 10 11 12 13 14 15

personen [ 2 ] = name = Maurits C o r n e l i s Escher , g e b u r t s j a h r = 1898 , todesjahr = 1972 , f o r v a r i a b l e , p e r s o n i n p a i r s ( p e r s o n e n ) do p r i n t ( v a r i a b l e , p e r s o n . name ) end Das Ergebnis: 1 Kurt Gdel o 2 Maurits Cornelis Escher

8 Beispiele mit regulren Ausdrcke a u


Beispielprogramm
1 2 3 4

s = h e l l o world from Lua f o r w i n s t r i n g . g f i n d ( s , %a+ ) do p r i n t (w) end Das Ergebnis: hello world from Lua %a ist ein Pattern, das fr Buchstaben steht. + wiederholt dieses. Ergebnis: Der String u wird wortweise ausgegeben. Beispielprogramm

1 2 3 4 5 6 7 8

function testbalancedscan ( s ) p r i n t ( > , s ) f o r w i n s t r i n g . g f i n d ( s , %b{} ) do p r i n t (w) end end t e s t b a l a n c e d s c a n ( H a l l o { s c h ne und wunderbare } Welt ) o t e s t b a l a n c e d s c a n ( H a l l o { s c h ne {und} wunderbare } Welt ) o

http://lua.lickert.net

19/20

8 Beispiele mit regulren Ausdr cke a u Das Ergebnis: ---- Hallo schne und wunderbare Welt o schne und wunderbare o ---- Hallo schne und wunderbare Welt o schne und wunderbare o Mit %b knnen geschachtelte Klammern analysiert werden. Ublicherweise wrde im o u zweiten Aufruf schne und o als Ergebnis kommen.

8.1 Patterns
Buchstaben denieren sich selbst, ausser sie sind eines der folgenden Zeichen: $()%.[]*+-? Es gibt folgende Zeichenklassen: . (ein Punkt) Ein beliebiges Zeichen. %a Ein beliebiger Buchstabe %c Ein Kontrollzeichen %d Eine beliebige Zier (digit) %l Ein beliebiger Kleinbuchstabe (lower case) %p Ein beliebiges Satzzeichen (punctuation) %s Ein Leerzeichen (space characters). %u Ein beliebiger Grobuchstabe (uppercase). %w Ein beliebiges alphanumerisches Zeichen (word-character) %x Eine beliebige Hexadezimalzier. %z represents the character with representation 0 ? nil? %x Das Zeichen x selbst. (Escape-Mechanismus fr Pattern-Zeichen. u

http://lua.lickert.net

20/20