2.5 Ausdrücke Korrektur einreichen Original anzeigen

Die Basis-Ausdrücke in Lua lauten wie folgt:

exp ::= prefixexp
exp ::= nil | false | true
exp ::= Number
exp ::= String
exp ::= function
exp ::= tableconstructor
exp ::= `...´
exp ::= exp binop exp
exp ::= unop exp
prefixexp ::= var | functioncall | `(´ exp `)´

Zahlen und Literale werden unter § 2.1 erklärt; Variablen werden unter § 2.3 erklärt; Funktionsdefinitionen werden unter § 2.5.9 erklärt; Funktionsaufrufe werden unter § 2.5.8 erklärt; Tabellenkonstruktoren werden unter § 2.5.7 erklärt. Ausdrücke mit variabler Anzahl an Argumenten – geschrieben durch drei Punkte ('...') – können nur direkt innerhalb einer solchen Funktion verwendet werden; diese werden unter § 2.5.9 erklärt.

Binäre Operatoren beinhalten arithmetische Operatoren (s. § 2.5.1), relationale Operatoren (s. § 2.5.2), logische Operatoren (s. §2.5.3) und den Konkatenierungsoperator (s. § 2.5.4). Unäre Operatoren enthalten das unäre Minus (s. § 2.5.1), das unäre not (s. § 2.5.3) und den unären Längenoperator (s. § 2.5.5).

Sowohl Funktionsaufrufe als auch Ausdrücke mit variabler Anzahl an Argumenten können in mehreren Werten resultieren. Wenn ein Ausdruck als Anweisung benutzt wird (nur für Funktionsaufrufe möglich, s. § 2.4.6)), wird deren Rückgabeliste auf 0 Elemente begrenzt und verwirft somit alle Rückgaben. Falls ein Ausdruck als letztes (oder einziges) Element einer Liste von Ausdrücken benutzt wird, findet keine Anpassung statt (sofern der Aufruf nicht geklammert ist). In allen anderen Fällen wird das Ergebnis auf ein Element begrenzt, wobei alle Werte außer dem ersten verworfen werden.

Hier sind ein paar Beispiele:

f()                -- liefert keine Ergebnisse
g(f(), x)          -- f() liefert ein Ergebnis
g(x, f())          -- g erhält x und alle Ergebnisse von f()
a,b,c = f(), x     -- f() liefert ein Ergebnis (c wird nil)
a,b = ...          -- a erhält den ersten variablen Parameter, b erhält den
                   -- zweiten (sowohl a als auch b können nil werden, wenn
                   -- kein entsprechender variabler Parameter existiert)

a,b,c = x, f()     -- f() liefert zwei Ergebnisse
a,b,c = f()        -- f() liefert drei Ergebnisse
return f()         -- liefert alle Ergebnisse von f()
return ...         -- liefert alle erhaltenen variablen Parameter
return x,y,f()     -- liefert x, y und alle Ergebnisse von f()
{f()}              -- erzeugt eine Liste aus allen Ergebnissen von f()
{...}              -- erzeugt eine Liste aus allen variablen Parametern
{f(), nil}         -- f() liefert ein Ergebnis

Jeder geklammerte Ausdruck liefert jeweils genau einen Wert. Insofern ist (f(x,y,z)) immer ein einzelner Wert, auch wenn f mehrere Werte liefert. (Der Wert von (f(x,y,z)) ist der erste von f gelieferte Wert oder nil, wenn f keinerlei Werte zurückgibt.)