Lua Language
Contents
Introduction
Lua is a lightweight, scripting programming language based on an interpreter generating compiled bytecodes (code executing in a virtual machine).
It was designed in Brasil by Roberto Ierusalimschy, Waldemar Celes and Luiz Henrique de Figueiredo in 1993.
CE Lua is a specific version of Lua interpreter adapted by Dark Byte for Cheat Engine. The CE Lua Engine is a main component of Cheat Engine.
This wiki page is written for Lua beginners. If you know the basic Lua syntax then you can go to the next page.
Syntax
CE Lua interpreter respects traditional LUA syntax and provides some extra features. The Lua Script Editor provide a real-time colored syntax and a Syntax Check feature (Ctrl+Alt+C).
Comments
In Lua simple comments begin with --
and end at the end of line.
Multi-line comments begin with --[[
and end with ]]
.
-- This is a simple comment just to the end of this line This is not a comment but a future syntax error -- This is a new simple comment --[[ First line of a multi-line comment Second line of a multi-line comment Last line of a multi-line comment]]
Variables, types and operators
In Lua variables are polymorphic (can change the type during theirs lifes). By default a variable is global at Lua Engine level unless the declaration begins with local
modifier.
The assign operator =
is mandatory just for the global variable declaration and can be use later to modify any variable.
Any variable can host different data types and use specific operators:
- nil meaning nothing (a variable not defined, or not assigned, or assigned to
nil
)- Comparing operators: comparing any variable to
nil
(var == nil
orvar ~= nil
)
- Comparing operators: comparing any variable to
- a number value (no difference between integer or float values, nor between different precisions)
- Binary arithmetic operators between two numbers:
+
,-
,*
,/
. - Unary arithmetic operators:
+
,-
(example:var1 = -var2
) - Comparing operators between two numebers giving a boolean:
>
,>=
,<
,<=
,==
,~=
.
- Binary arithmetic operators between two numbers:
- a boolean value (equal to
true
orfalse
)- Binary boolean operators:
and
,or
. - Unary boolean operator:
not
.
- Binary boolean operators:
- a string (constants can be surrounded by single
'string'
or double quotes"string"
or double square brackets[[string]]
; the last case accepts new lines inside)- Concatenation operator:
..
between two strings. - Comparing operators between two strings content giving a boolean:
>
,>=
,<
,<=
,==
,~=
.
- Concatenation operator:
- a table
- Indexing operator:
[ ]
return the the associated value of an index/key in a table
- Indexing operator:
- a function
Tips:
- Always use the right operators for the right types.
- Always use parethesis for complex expressions (the expression
not var1==nil or var1~=3
is not equal tonot (var1==nil or var1~=3)
). - Use the function
type
to get a string containing the real type of a variable.
Examples:
local MyVar0 -- local variable having nothing inside so equal to nil MyVar1 = nil -- global variable MyVar1 having nothing inside (no type neither) MyVar2 = UnknownVar -- another global variable equal to nil (because UnknowVar is not yet defined) local MyVar3 = 2 -- local numerical variable MyVar3 equal to 2 MyVar4 = 'Hello' -- global string variable MyVar4 local MyVar5 = "Hello" -- local string variable MyVar5 having the same string as MyVar3 MyVar6 = [[First Line Second Line.]] -- global multi-line string variable MyVar6 beginning with 'First' and ending with 'Line.' MyVar2 = (10 > 7.55) -- now MyVar2 becomes a boolean equal to true MyVar7 = print -- global function variable MyVar7 which can be used as an alias of print function
Copy operations:
For any copy operation like assignment, function calling arguments and function returns, Lua performs a copy by value (real copy) for nil, numbers, strings, booleans types and performs a copy be reference (not a new copy, just pointing to the original) for tables and functions.
Console output
Lua uses the print
function to output numericals and strings to the console (use the menu to open the Lua Engine console).
The print
function has a variable number of arguments. Each argument (string or numerical) will be printed to the console and a new line will be added at the end. Automatically a space will be added between consecutive number arguments. The default format for numericals is the decimal base with automatic use of decimal point if necessary.
Examples:
print(MyVar1) -- prints an empty line because MyVal1 is nil print('MyVar3=',MyVar3,MyVar3,MyVar3) -- prints the line 'MyVar3=2 2 2' print("MyVar2 = ",MyVar2) -- prints just the line 'MyVar2 = ' because MyVar2 is not a numerical nor a string print(MyVar4..' and '..MyVar5..' again') -- prints 'Hello and Hello again' MyVar7("9.9+0.1=",9.9+0.1) -- prints the line '9.9+0.1=10.0' (because MyVar7 is now equal to print) MyVar7('1/0=',1/0) -- prints the line '1/0=inf'
Flow control
Lua provides a conditional test with multiple, optional branches:
if BooleanExpression then -- if statement(s) body elseif BooleanExpression then -- optional -- elseif statement(s) body else -- optional -- else/default statement(s) body end
and several conditional loops:
while BooleanExpression do -- do statements while BooleanExpression is true --statements end repeat -- repeat statements --statements until BooleanExpression -- until BooleanExpression becomes true for Idx = Start,Stop,Step do -- any numerical value for Start, Stop and Step (Step is optional and defaults to 1) --statements end -- loop while Idx <= Stop (for positive Step) or Idx >= Stop (for negative Step) for KeyIdx,Val in ListExpr do -- it loops over all the ListExpr, giving for each element the KeyIdx and the Val --statements -- KeyIdx and Val available inside the for loop end
Lua has a special unconditional block mainly used to isolate some local variables:
do --statements end
Any flow control instruction can be embedded in any other flow control instruction.
Examples:
i=5 while i<80 do -- it loops for i equal to 5, 10, 20, and 40 i=i*2 end i=5 repeat -- it loops for i equal to 10, 20, 40, 80 i=i*2 until i==80 i=5 repeat i=i*2 until i==82 -- warning: this loop will never ending and will block the Lua Engine & Cheat Engine for i = 10, 14 do -- it loops for i equal to 10, 11, 12, 13, and 14 end for i = 10, 14, 2 do -- it loops for i equal to 10, 12, and 14 end for i = 10, 14, 2.1 do -- it loops for i equal to 10 and 12.1 end for i = 10, 14, -2.1 do -- it never loops because the start value 10<14 and step is negative end for i = 14, 10, -2.1 do -- it loops for i equal to 14 and 11.8 end do local MyVar=314; print(MyVar) -- prints '314' and new line end printf(MyVar) -- prints nothing but a new line
Functions
Functions are just some special variables, and can be declared at the global level or inside a block or another function.
-- first syntax version function MyFunction(arg1, arg2, ...) -- takes 0, 1 to several arguments or undefined number of arguments -- statements return result1, result2 -- returns 0, 1 to several variables end -- second syntax version MyFunction = function(arg1, arg2, ...) -- takes 0, 1 to several arguments or undefined number of arguments -- statements return result1, result2 -- returns 0, 1 to several variables end
Any of preceding 2 declaration versions creates a function variable named MyFunction
. Then the user can call it, use it or assign it a new value.
Examples:
MyFunction(MyVar4, MyVar2, MyVar7) -- calling MyFunction with 3 arguments MyVar1 = MyFunction(MyVar2, MyVar7) -- calling MyFunction with 2 arguments and keep the first result in MyVar1 print = MyFunction -- now the official print function will be MyFunction MyFunction = nil -- MyFunction will be unavailable now (but print still keeps original MyFunction) MyFunction = MyVar7 -- now MyFunction is an alias of the original print function
Any type of arguments or return values are copied by value except for table arguments copied by reference.
Any absent argument at function call will have a nil
value during calling execution.
Examples:
Func1=function(Tab, Idx) if(Idx==nil) then Idx=1 end -- giving a default value 1 Tab[Idx]=-100 -- changing a first element of List and the real calling argument table (reference not copy) Idx=33 -- changing Idx value, no effect to the real argument, this is a copy value end function Show(Tab) -- prints the first 3 elements of Tab, on the same line print(Tab[1],Tab[2],Tab[2]) end function Show2(Tab) -- prints the first 3 elements of Tab, one by line for Idx=1,3 do print(Tab[Idx]) end end function Show3(Tab) -- prints all elements of Tab, one by line for Idx in ipairs(Tab) do -- using the build-in iterator ipairs on input table print(Tab[Idx]) -- print value using the [] operator end end function Show4(Tab) -- prints all elements of Tab, one by line for Idx,Val in ipairs(Tab) do -- using the build-in iterator ipairs on input table print(Val) -- print directly the value end end local MyTab1 = {10, 20, 30} -- local table with 3 numbers local MyIdx = 2 Show(MyTab1) -- prints '10 20 30' Func1(MyTab1,MyIdx) -- change value of 2nd element of MyTab1 but no the value of MyIdx Show(MyTab1) -- prints '20 -100 30' Func1(MyTab1,MyIdx) -- change value of 1st element of MyTab1 but no the value of MyIdx Show(MyTab1) -- prints '-100 -100 30' Show2(MyTab1) -- prints on 3 lines '-100' '-100' '30' Show3(MyTab1) -- prints on 3 lines '-100' '-100' '30' Show4(MyTab1) -- prints on 3 lines '-100' '-100' '30'
Tables
Tables are a very special build-in data type providing the only way to create user-defined data structures. Tables are heterogeneous associative arrays where each element is a pair of a key/index and a data/value and the data type can be different than the others. Lua provides automatic numeric key creation and build-in functions for access, iteration, adding etc.
A table declaration uses { }
and inside elements are separated by ,
. Implicit keys/indexes begin to 1. Explicit keys/indexes declaration use this special syntax for each element:[key]=value
.
-- creates an empty table Tab0 = {} -- creates an homogenous table of 3 pairs (number key/index, number value): (1,5), (2,10), and (3,20) Tab1 = {5, 10, 20} -- creates an heterogeneous table of 3 pairs: (number 1,number 0), (number 2,string "second"), (number 3,function print) Tab2 = {0, "second", print} -- creates an heterogeneous table Tab3 of 3 pairs: (string 'no_space',number 8), (string 'string with spaces',boolean true), (number 12,table Tab2) -- warning: the value of the 3th element is not a new copy of Tab2 but really Tab2 (Lua uses copy by reference for tables!) Tab3 = {no_space = 8, ['string with spaces'] = true, [12] = Tab2}