Belajar Lua kurang dari 20 menit
Lua merupakan bahasa pemprograman scripting (dijalankan tanpa compile) sama seperti Javascript, Python, Ruby, dsb. Alasan awal penulis mempelajari bahasa ini adalah untuk mengkonfigurasi neovim. Walaupun syntax-nya terlihat simpel, tapi sebenarnya bahasa ini sangat powerful, bahkan dapat digunakan dalam game development.
- Variabel, Tipe data dan Komentar
- Operator Perhitungan, Perbandingan dan Logika
- Percabangan dan Perulangan
- Fungsi
- Table
- Modul
- Referensi
Warning
Lua yang digunakan penulis dalam artikel ini adalah Lua versi 5.4.x, jika ada perbedaan syntax atau fungsi silahkan rujuk kembali didokumentasi resmi Lua.
Variabel, Tipe data dan Komentar
Variabel
Terdapat 2 tipe variabel dalam Lua, yaitu variabel global dan variabel lokal. Variabel global dapat diakses dari seluruh bagian program sedangkan variabel lokal hanya dapat diakses dalam kode blok tempat dimana ia didefinisikan, seperti didalam blok fungsi.
1
2
3
4
5
6
7
8
nama1 = "Boby" -- variabel global
print(nama1) -- Boby
function nama() -- awal blok fungsi nama
local nama2 = "Boby" -- variabel lokal
return print(nama2)
end -- akhir blok fungsi
print(nama2) -- error, nama2 hanya dapat diakses dalam blok fungsi
Info
Penggunaan variabel global lebih baik dihindari, karena dapat menyebabkan masalah keamanan dan kesulitan pemeliharaan program.
Tipe data
Terdapat 6 macam tipe data dasar dalam Lua, antara lain :
-
String
Mempresentasikan teks atau karakter.
-
Number
Mempresentasikan angka, termasuk integer atau float. Lua menyimpan variabel angka dalam bentuk float.
-
Boolean
Mempresentasikan nilai logika benar atau salah, bernilai
true
ataufalse
. -
Table
Mempresentasikan nilai data yang kompleks. Table dalam Lua digunakan seperti Array atau Object dalam Javascript.
-
Nil
Mempresentasikan nilai kosong. Dalam Lua, nil biasa digunakan untuk menghapus nilai dari sebuah variabel atau tabel.
-
Function
Mempresentasikan fungsi atau prosedur dalam program.
1
2
3
4
5
6
print(type("Hello world")) -- String
print(type(10.4*3)) -- Number
print(type(true)) -- Boolean
print(type({nama = "Boby", usia = 22})) -- Table
print(type(nil)) -- Nil
print(type(print)) -- Function
Komentar
Komentar merupakan bagian dari kode yang tidak dieksekusi oleh komputer. Komentar biasanya digunakan untuk memberi keterangan atau dokumentasi terkait suatu kode.
1
2
3
4
5
6
-- Dua garis untuk memulai 1 baris komentar.
--[[
Tambahkan 2 kurung kotak untuk membuat beberapa baris komentar.
Komentar ini tidak dieksekusi oleh komputer.
]]
Operator Perhitungan, Perbandingan dan Logika
Perhitungan
Operator | Digunakan untuk |
---|---|
+ |
Penjumlahan |
- |
Pengurangan |
* |
Perkalian |
/ |
Pembagian |
% |
Modulus / Sisa hasil bagi |
^ |
Pemangkatan |
1
2
3
4
5
6
print(10 + 2) -- 12
print(10 - 2) -- 8
print(10 * 2) -- 20
print(10 / 2) -- 5
print(10 % 2) -- 0
print(10 ^ 2) -- 100
Perbandingan
Operator | Keterangan |
---|---|
== |
Sama dengan |
~= |
Tidak sama dengan |
< |
Kurang dari |
> |
Lebih dari |
<= |
Kurang dari sama dengan |
>= |
Lebih dari sama dengan |
1
2
3
4
5
6
print(10 == 2) -- false
print(10 ~= 2) -- true
print(10 < 2) -- false
print(10 > 2) -- true
print(10 <= 2) -- false
print(10 >= 2) -- true
Logika
Operator | Keterangan |
---|---|
and |
Mengembalikan nilai true jika kedua ekspresi bernilai true , dan false jika salah satu atau kedua ekspresi bernilai false . |
or |
Mengembalikan nilai true jika salah satu atau kedua ekspresi bernilai true , dan false jika kedua ekspresi bernilai false . |
not |
Mengembalikan nilai false jika ekspresi bernilai true , dan true jika ekspresi bernilai false . |
1
2
3
4
5
6
7
8
9
10
11
12
13
-- Operator AND
print(true and true) -- true
print(true and false) -- false
print(false and false) -- false
-- Operator OR
print(true or true) -- true
print(true or false ) -- true
print(false or false) -- false
-- Operator NOT
print(not true) -- false
print(not false) -- true
Percabangan dan Perulangan
Percabangan
Percabangan pada Lua menggunakan if
, elseif
, dan else
. Untuk saat ini Lua belum mengimplementasi percabangan switch
seperti pada Javascript.
1
2
3
4
5
6
7
8
9
10
11
12
13
local nilai = 80
if nilai >= 90 then
print("Nilai Anda A")
elseif nilai >= 80 then
print("Nilai Anda B")
elseif nilai >= 70 then
print("Nilai Anda C")
else
print("Nilai Anda D")
end
-- Output => Nilai Anda B.
Perulangan
Terdapat 2 jenis perulangan pada Lua, yaitu for
dan while
. Perulangan for
biasanya digunakan pada counted loop atau perulangan yang jumlahnya sudah diketahui. Sebaliknya, perulangan while
digunakan pada uncounted loop atau perulangan yang jumlahnya belum diketahui.
Jika dianalogikan, counted loop seperti kamu berlari 10 putaran, sedangkan uncounted loop seperti kamu berlari sampai lelah.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
-- Perulangan for
for i = 1, 5 do
print("Perulangan ke-"..i) -- string concatination pada Lua menggunakan titik dua kali (..).
end
-- Perulangan while
print("Masukkan angka ganjil:")
local input = io.read("*n") -- Membaca input dari pengguna sebagai angka.
-- Perulangan while akan terus berjalan jika user menginput angka genap.
while input % 2 == 0 do
print("Angka yang dimasukkan harus ganjil, coba lagi:")
input = io.read("*n")
end
print("Angka yang dimasukkan adalah:", input)
Info
Perlu diingat, bahwa tidak ada penggunaan curly bracket ({}) dalam Lua. Percabangan menggunakan 'then' dan untuk perulangan menggunakan 'do' dan keduanya diakhiri dengan 'end'.
Fungsi
Terdapat 2 jenis fungsi dalam Lua, yaitu built-in function dan user defined function. Built-in function adalah fungsi bawaan yang sudah tersedia dan siap digunakan tanpa didefinisikan terlebih dahulu, seperti math.abs()
, table.insert()
, dll. Sedangkan user defined function merupakan fungsi yang didefinisikan oleh pengguna itu sendiri.
Ada beberapa cara dalam mendefinisikan fungsi, yaitu:
- Dengan cara umum atau biasa yaitu menggunakan keyword
function
. - Dengan menyimpannya ke dalam variabel. Cara ini dilakukan dengan mendefinisikan anonymous function (fungsi tanpa nama) ke dalam suatu variabel.
1
2
3
4
5
6
7
8
9
10
11
12
13
-- Dengan cara biasa
function hello()
print("Hello World!")
end
hello() -- Output => Hello World!
-- Dengan variabel
local hello = function()
print("Hello World!")
end
hello() -- Output => Hello World!
Perlu diperhatikan, bahwa fungsi diatas tidak menggunakan parameter. Parameter digunakan untuk mengolah data dalam fungsi.
1
2
3
4
5
6
function tambah(a,b) -- "a" dan "b" merupakan parameter.
return a + b
end
-- Gunakan fungsi print() untuk mencetak output.
print(tambah(5,3)) -- Output => 8
Info
Karena tidak adanya penggunaan curly bracket, maka pada setiap pendefinisian fungsi jangan lupa untuk menutup fungsi dengan menggunakan keyword 'end'.
Table
Table merupakan tipe data dalam Lua yang penggunaanya mirip seperti Array atau Object dalam Javascript. Table juga dapat dijadikan seperti assosiative array karena setiap elemen dalam table dapat memiliki key atau kunci unik untuk mengakses nilai dalam table tersebut. Key tersebut dapat berupa Number atau String.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
-- Inisiasi table kosong
local buah = {}
local mahasiswa = {}
-- Inisiasi table dengan nilai
local buah = {"Pisang", "Mangga", "Nanas"} -- table dengan index bawaan (tanpa mengisiasi key).
local mahasiswa = {nama = "Boby", usia = 20} -- table dengan assosiative key.
-- Menambah nilai kedalam table
buah[4] = "Melon" -- Menambah nilai table buah di-index 4.
mahasiswa["alamat"] = "Brebes" -- Menambah nilai dengan menambahkan key.
-- Mencetak nilai table dengan index/key
print(buah[2]) -- Output => Mangga
print(mahasiswa["nama"]) -- Output => Boby
print(mahasiswa.nama) -- Nilai dapat diakses dengan cara dot-notation seperti Javascript.
-- Mencetak nilai table menggunakan looping
for index, value in pairs(buah) do
print(index .. ". " .. value)
end
--[[ Output =>
1. Pisang
2. Mangga
3. Nanas
4. Melon
]]
for index, value in pairs(mahasiswa) do
print(index .. ": " .. value)
end
--[[ Output =>
nama: Boby
usia: 20
alamat: Brebes
]]
-- Mencari jumlah item dalam table
print(#buah) --[[ Output => 4.
Untuk mencari jumlah item dalam table dalam Lua,
cukup dengan operator # disertai dengan nama table.
]]
-- Menghapus nilai dari table
buah = nil
mahasiswa = nil
Info
Perlu diperhatikan bahwa index table dalam Lua dimulai dari 1 bukan 0.
Manipulasi table
Ada beberapa fungsi bawaan dari Lua untuk memanipulasi table, antara lain:
Fungsi | Keterangan |
---|---|
table.concat(table [, sep [, i [, j]]]) |
Menggabungkan string dalam table berdasarkan parameter yang diberikan. |
table.insert(table, [pos,] value) |
Menyisipkan nilai ke dalam table pada posisi tertentu. |
table.move (a1, f, e, t [,a2]) |
Memindahkan nilai table a1 ke table a2 dengan parameter tertentu. |
table.pack (···) |
Membuat table baru dengan tambahan key “n” diakhir table yang berisi jumlah item table. |
table.remove(table, [pos,]) |
Menghapus nilai dari table. |
table.sort(table [, comp]) |
Mengurutkan table berdasarkan parameter yang diberikan. |
table.unpack(table [, i [, j]]) |
Mengekstrak nilai dari tabel. |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
local buah = {"Pisang", "Mangga", "Nanas"}
-- fungsi table.concat()
print(table.concat(buah)) -- Output => PisangManggaNanas
print(table.concat(buah, ", ")) -- Output => Pisang, Mangga, Nanas (parameter ke-2 untuk menentukan separator).
print(table.concat(buah, ", ", 2, 3)) -- Output => Mangga, Nanas (parameter ke-3 untuk menentukan awal dan parameter ke-4 untuk akhir).
-- fungsi table.insert() & table.remove()
table.insert(buah, "Melon") -- Tanpa menentukan posisi (parameter ke-2) akan menyisipkan nilai diakhir table.
print(buah[4]) -- Output => Melon
table.insert(buah, 2, "Melon") -- Menyisipkan Melon di-index nomor 2.
print(buah[2]) -- Output => Melon
table.remove(buah) -- Tanpa menentukan posisi (parameter ke-2) akan menghapus nilai diakhir table.
print(buah[5]) -- Output => nil
table.remove(buah, 2) -- Menghapus nilai di-index 2, yaitu Melon.
print(buah[2]) -- Output => Mangga
-- fungsi table.move()
local buah2 = {"Melon", "Apel"}
-- table.move(table sumber, index awal, index akhir, index awal penyisipan, table tujuan)
table.move(buah, 1, 2, 2, buah2)
for index, value in pairs(buah2) do
print(index .. ". " .. value)
end
--[[ Output =>
1. Melon
2. Pisang
3. Mangga
Apel ditimpa oleh Pisang karena index awal penyisipan dimulai dari 2
]]
-- fungsi table.pack()
local buah3 = table.pack("Apel", "Melon")
for index, value in pairs(buah3) do
print(index .. ". " .. value)
end
--[[ Output =>
1. Apel
2. Melon
n. 2
table.pack() menambahkan key "n" berisi jumlah item dalam tabel
]]
-- fungsi table.sort()
-- Sebelum sorting
for index, value in pairs(buah) do
print(index .. ". " .. value)
end
--[[ Output =>
1. Pisang
2. Mangga
3. Nanas
]]
-- setelah sorting
table.sort(buah)
for index, value in pairs(buah) do
print(index .. ". " .. value)
end
--[[ Output =>
1. Mangga
2. Nanas
3. Pisang
]]
-- fungsi table.unpack()
local a, b, c = table.unpack(buah)
print(a, b, c) --[[ Output => Mangga Nanas Pisang.
Variabel a, b, dan c memiliki nilai sesuai urutan dalam table buah.
]]
Modul
Konsep modul dalam Lua adalah memecah kode program menjadi beberapa file agar dapat digunakan kembali (reusable). Konsep seperti ini sama juga dalam beberapa bahasa pemprograman lainnya, seperti Javascript yang menggunakan export
& import
. Tetapi dalam Lua, untuk mengimport module menggunakan syntax require
dan untuk mengexport module menggunakan return
.
1
2
3
4
5
6
7
8
-- file myModule.lua
local M = {}
function M.hello()
return print("Hello World!")
end
return M
1
2
3
4
-- file main.lua
local myModule = require("myModule")
myModule.hello() -- Output => "Hello World!"