Lua - Panduan Cepat

Lua adalah bahasa pemrograman yang ringan dan dapat diperluas yang ditulis dalam C. Ini dimulai sebagai proyek internal pada tahun 1993 oleh Roberto Ierusalimschy, Luiz Henrique de Figueiredo, dan Waldemar Celes.

Ini dirancang dari awal menjadi perangkat lunak yang dapat diintegrasikan dengan kode yang ditulis dalam C dan bahasa konvensional lainnya. Integrasi ini membawa banyak manfaat. Ia tidak mencoba melakukan apa yang sudah bisa dilakukan C tetapi bertujuan untuk menawarkan apa yang tidak bisa dilakukan C: jarak yang baik dari perangkat keras, struktur dinamis, tidak ada redundansi, kemudahan pengujian dan debugging. Untuk ini, Lua memiliki lingkungan yang aman, manajemen memori otomatis, dan fasilitas yang baik untuk menangani string dan jenis data lainnya dengan ukuran dinamis.

fitur

Lua menyediakan serangkaian fitur unik yang membuatnya berbeda dari bahasa lain. Ini termasuk -

  • Extensible
  • Simple
  • Efficient
  • Portable
  • Bebas dan terbuka

Kode Contoh

print("Hello World!")

Bagaimana Lua Diimplementasikan?

Lua terdiri dari dua bagian - bagian juru bahasa Lua dan sistem perangkat lunak yang berfungsi. Sistem perangkat lunak yang berfungsi adalah aplikasi komputer sebenarnya yang dapat menafsirkan program yang ditulis dalam bahasa pemrograman Lua. Interpreter Lua ditulis dalam ANSI C, oleh karena itu sangat portabel dan dapat berjalan pada spektrum perangkat yang luas dari server jaringan kelas atas hingga perangkat kecil.

Baik bahasa Lua maupun penafsirnya matang, kecil, dan cepat. Ini telah berkembang dari bahasa pemrograman lain dan standar perangkat lunak teratas. Ukurannya yang kecil memungkinkannya berjalan di perangkat kecil dengan memori rendah.

Mempelajari Lua

Poin terpenting saat mempelajari Lua adalah fokus pada konsep tanpa tersesat dalam detail teknisnya.

Tujuan belajar bahasa pemrograman adalah untuk menjadi programmer yang lebih baik; yaitu, menjadi lebih efektif dalam merancang dan menerapkan sistem baru dan memelihara yang lama.

Beberapa Kegunaan Lua

  • Pemrograman Game

  • Pembuatan Skrip dalam Aplikasi Mandiri

  • Membuat skrip di Web

  • Ekstensi dan add-on untuk database seperti MySQL Proxy dan MySQL WorkBench

  • Sistem keamanan seperti Sistem Deteksi Intrusi.

Pengaturan Lingkungan Lokal

Jika Anda masih ingin mengatur lingkungan Anda untuk bahasa pemrograman Lua, Anda memerlukan perangkat lunak berikut yang tersedia di komputer Anda - (a) Editor Teks, (b) Penerjemah Lua, dan (c) Kompiler Lua.

Editor Teks

Anda membutuhkan editor teks untuk mengetik program Anda. Contoh beberapa editor termasuk Windows Notepad, perintah OS Edit, Brief, Epsilon, EMACS, dan vim atau vi.

Nama dan versi editor teks dapat berbeda di setiap sistem operasi. Misalnya, Notepad akan digunakan di Windows, dan vim atau vi dapat digunakan di Windows serta Linux atau UNIX.

File yang Anda buat dengan editor Anda disebut file sumber dan file ini berisi kode sumber program. File sumber untuk program Lua biasanya dinamai dengan ekstensi".lua".

Penerjemah Lua

Ini hanyalah program kecil yang memungkinkan Anda untuk mengetik perintah Lua dan menjalankannya dengan segera. Ia menghentikan eksekusi file Lua jika ia menemui kesalahan tidak seperti kompilator yang dijalankan sepenuhnya.

Penyusun Lua

Ketika kita memperluas Lua ke bahasa / aplikasi lain, kita membutuhkan Kit Pengembangan Perangkat Lunak dengan kompiler yang kompatibel dengan Antarmuka Program Aplikasi Lua.

Instalasi di Windows

Ada IDE terpisah bernama "SciTE" yang dikembangkan untuk lingkungan windows, yang dapat diunduh dari https://code.google.com/p/luaforwindows/ bagian unduhan.

Jalankan file yang dapat diunduh untuk menginstal Lua IDE.

Karena ini adalah IDE, Anda berdua dapat membuat dan membuat kode Lua menggunakan yang sama.

Jika Anda tertarik untuk menginstal Lua dalam mode baris perintah, Anda perlu menginstal MinGW atau Cygwin dan kemudian mengkompilasi dan menginstal Lua di windows.

Instalasi di Linux

Untuk mengunduh dan membangun Lua, gunakan perintah berikut -

$ wget http://www.lua.org/ftp/lua-5.2.3.tar.gz $ tar zxf lua-5.2.3.tar.gz
$ cd lua-5.2.3 $ make linux test

Untuk menginstal di platform lain seperti aix, ansi, bsd, linux generik, mingw, posix, solaris dengan mengganti Linux di make Linux, uji dengan nama platform yang sesuai.

Kami memiliki helloWorld.lua, di Lua sebagai berikut -

print("Hello World!")

Sekarang, kita dapat membangun dan menjalankan file Lua say helloWorld.lua, dengan beralih ke folder yang berisi file tersebut menggunakan cd, dan kemudian menggunakan perintah berikut -

$ lua helloWorld

Kita bisa melihat outputnya sebagai berikut.

Hello World!

Instalasi di Mac OS X

Untuk membangun / menguji Lua di Mac OS X, gunakan perintah berikut -

$ curl -R -O http://www.lua.org/ftp/lua-5.2.3.tar.gz
$ tar zxf lua-5.2.3.tar.gz $ cd lua-5.2.3
$ make macosx test

Dalam kasus tertentu, Anda mungkin belum menginstal Xcode dan alat baris perintah. Dalam kasus seperti itu, Anda tidak akan dapat menggunakan perintah make. Instal Xcode dari toko aplikasi mac. Lalu pergi ke Preferensi Xcode, lalu beralih ke Unduhan dan instal komponen bernama "Alat Baris Perintah". Setelah proses selesai, perintah buat akan tersedia untuk Anda.

Anda tidak wajib menjalankan pernyataan "make macosx test". Bahkan tanpa menjalankan perintah ini, Anda masih dapat menggunakan Lua di Mac OS X.

Kami memiliki helloWorld.lua, di Lua, sebagai berikut -

print("Hello World!")

Sekarang, kita dapat membangun dan menjalankan file Lua say helloWorld.lua dengan beralih ke folder yang berisi file tersebut menggunakan cd dan kemudian menggunakan perintah berikut -

$ lua helloWorld

Kita dapat melihat output berikut -

Hello World!

Lua IDE

Seperti disebutkan sebelumnya, untuk Windows SciTE, Lua IDE adalah IDE default yang disediakan oleh tim pembuat Lua. IDE alternatif yang tersedia adalah dari ZeroBrane Studio, yang tersedia di berbagai platform seperti Windows, Mac dan Linux.

Ada juga plugin untuk eclipse yang memungkinkan pengembangan Lua. Penggunaan IDE mempermudah pengembangan dengan fitur-fitur seperti penyelesaian kode dan sangat disarankan. IDE juga menyediakan pemrograman mode interaktif yang mirip dengan versi baris perintah Lua.

Mari kita mulai membuat program Lua pertama kita!

Program Lua Pertama

Pemrograman Mode Interaktif

Lua menyediakan mode yang disebut mode interaktif. Dalam mode ini, Anda dapat mengetikkan instruksi satu demi satu dan mendapatkan hasil instan. Ini bisa dipanggil di shell dengan menggunakan lua -i atau hanya dengan perintah lua. Setelah Anda mengetik ini, tekan Enter dan mode interaktif akan dimulai seperti yang ditunjukkan di bawah ini.

$ lua -i $ Lua 5.1.4  Copyright (C) 1994-2008 Lua.org, PUC-Rio
quit to end; cd, dir and edit also available

Anda dapat mencetak sesuatu menggunakan pernyataan berikut -

print("test")

Setelah Anda menekan enter, Anda akan mendapatkan output berikut -

test

Pemrograman Mode Default

Memanggil interpreter dengan parameter nama file Lua memulai eksekusi file dan berlanjut hingga skrip selesai. Saat skrip selesai, penerjemah tidak lagi aktif.

Mari kita tulis program Lua sederhana. Semua file Lua akan memiliki ekstensi .lua. Jadi letakkan kode sumber berikut di file test.lua.

print("test")

Dengan asumsi, lingkungan lua sudah diatur dengan benar, mari kita jalankan program menggunakan kode berikut -

$ lua test.lua

Kami akan mendapatkan output berikut -

test

Mari kita coba cara lain untuk menjalankan program Lua. Di bawah ini adalah file test.lua yang dimodifikasi -

#!/usr/local/bin/lua

print("test")

Di sini, kami berasumsi bahwa Anda memiliki interpreter Lua di direktori / usr / local / bin Anda. Baris pertama diabaikan oleh interpreter, jika diawali dengan tanda #. Sekarang, coba jalankan program ini sebagai berikut -

$ chmod a+rx test.lua
$./test.lua

Kami akan mendapatkan output berikut.

test

Sekarang mari kita lihat struktur dasar dari program Lua, sehingga akan mudah bagi Anda untuk memahami blok bangunan dasar dari bahasa pemrograman Lua.

Token di Lua

Program Lua terdiri dari berbagai token dan token bisa berupa kata kunci, pengenal, konstanta, string literal, atau simbol. Misalnya, pernyataan Lua berikut terdiri dari tiga token -

io.write("Hello world, from ",_VERSION,"!\n")

Token individu adalah -

io.write
(
   "Hello world, from ",_VERSION,"!\n"
)

Komentar

Komentar seperti teks bantuan dalam program Lua Anda dan diabaikan oleh penerjemah. Mereka mulai dengan - [[dan diakhiri dengan karakter -]] seperti yang ditunjukkan di bawah ini -

--[[ my first program in Lua --]]

Pengenal

Pengenal Lua adalah nama yang digunakan untuk mengidentifikasi variabel, fungsi, atau item lain yang ditentukan pengguna. Pengenal dimulai dengan huruf 'A sampai Z' atau 'a sampai z' atau garis bawah '_' diikuti dengan nol atau lebih huruf, garis bawah, dan angka (0 sampai 9).

Lua tidak mengizinkan karakter tanda baca seperti @, $, dan% dalam pengenal. Lua adalah acase sensitivebahasa pemrograman. Jadi Tenaga Kerja dan tenaga kerja adalah dua pengenal berbeda di Lua. Berikut beberapa contoh pengenal yang dapat diterima -

mohd         zara      abc     move_name    a_123
myname50     _temp     j       a23b9        retVal

Kata kunci

Daftar berikut menunjukkan beberapa dari kata-kata yang telah dipesan dalam Lua. Kata yang dicadangkan ini tidak boleh digunakan sebagai konstanta atau variabel atau nama pengenal lainnya.

dan istirahat melakukan lain
elseif akhir Salah untuk
fungsi jika di lokal
nol tidak atau ulang
kembali kemudian benar sampai
sementara

Ruang kosong di Lua

Sebuah baris yang hanya berisi spasi, kemungkinan dengan sebuah komentar, dikenal sebagai baris kosong, dan juru bahasa Lua mengabaikannya sama sekali.

Spasi putih adalah istilah yang digunakan dalam Lua untuk mendeskripsikan blank, tab, karakter baris baru, dan komentar. Spasi putih memisahkan satu bagian pernyataan dari yang lain dan memungkinkan interpreter untuk mengidentifikasi di mana satu elemen dalam pernyataan, seperti int berakhir, dan elemen berikutnya dimulai. Oleh karena itu, dalam pernyataan berikut -

local age

Harus ada setidaknya satu karakter spasi (biasanya spasi) antara lokal dan usia agar penerjemah dapat membedakannya. Di sisi lain, dalam pernyataan berikut -

fruit = apples + oranges   --get the total fruit

Tidak ada karakter spasi kosong yang diperlukan antara buah dan =, atau antara = dan apel, meskipun Anda bebas memasukkan beberapa jika Anda ingin agar dapat dibaca.

Variabel tidak lain adalah nama yang diberikan ke area penyimpanan yang dapat dimanipulasi oleh program kami. Ini dapat menampung berbagai jenis nilai termasuk fungsi dan tabel.

Nama variabel dapat terdiri dari huruf, angka, dan karakter garis bawah. Ini harus dimulai dengan huruf atau garis bawah. Huruf besar dan kecil berbeda karena Lua peka huruf besar kecil. Ada delapan tipe nilai dasar di Lua -

Di Lua, meskipun kami tidak memiliki tipe data variabel, kami memiliki tiga tipe berdasarkan ruang lingkup variabel.

  • Global variables - Semua variabel dianggap global kecuali secara eksplisit dinyatakan sebagai lokal.

  • Local variables - Ketika tipe ditentukan sebagai lokal untuk variabel maka ruang lingkupnya dibatasi dengan fungsi di dalam ruang lingkupnya.

  • Table fields - Ini adalah jenis variabel khusus yang dapat menampung apa saja kecuali nil termasuk fungsi.

Definisi Variabel di Lua

Definisi variabel berarti memberi tahu penerjemah di mana dan berapa banyak untuk membuat penyimpanan untuk variabel. Definisi variabel memiliki tipe opsional dan berisi daftar satu atau lebih variabel dari tipe itu sebagai berikut -

type variable_list;

Sini, type secara opsional bersifat lokal atau jenis yang ditentukan menjadikannya global, dan variable_listdapat terdiri dari satu atau lebih nama pengenal yang dipisahkan dengan koma. Beberapa pernyataan valid ditampilkan di sini -

local    i, j
local    i
local    a,c

Garis local i, jkeduanya mendeklarasikan dan mendefinisikan variabel i dan j; yang menginstruksikan juru bahasa untuk membuat variabel bernama i, j dan membatasi cakupan menjadi lokal.

Variabel dapat diinisialisasi (diberi nilai awal) dalam deklarasi mereka. Penginisialisasi terdiri dari tanda sama dengan diikuti dengan ekspresi konstan sebagai berikut -

type variable_list = value_list;

Beberapa contohnya adalah -

local d , f = 5 ,10     --declaration of d and f as local variables. 
d , f = 5, 10;          --declaration of d and f as global variables. 
d, f = 10               --[[declaration of d and f as global variables. 
                           Here value of f is nil --]]

Untuk definisi tanpa penginisialisasi: variabel dengan durasi penyimpanan statis secara implisit diinisialisasi dengan nil.

Deklarasi Variabel di Lua

Seperti yang Anda lihat pada contoh di atas, tugas untuk variabel kelipatan mengikuti format variable_list dan format value_list. Pada contoh di ataslocal d, f = 5,10 kami memiliki d dan f di variable_list dan 5 dan 10 di daftar nilai.

Penetapan nilai di Lua berlangsung seperti variabel pertama di variable_list dengan nilai pertama di value_list dan seterusnya. Sehingga nilai d adalah 5 dan nilai f adalah 10.

Contoh

Coba contoh berikut, di mana variabel telah dideklarasikan di bagian atas, tetapi mereka telah ditentukan dan diinisialisasi di dalam fungsi utama -

-- Variable definition:
local a, b

-- Initialization
a = 10
b = 30

print("value of a:", a)

print("value of b:", b)

-- Swapping of variables
b, a = a, b

print("value of a:", a)

print("value of b:", b)

f = 70.0/3.0
print("value of f", f)

Ketika kode di atas dibuat dan dijalankan, itu menghasilkan hasil sebagai berikut -

value of a:	10
value of b:	30
value of a:	30
value of b:	10
value of f	23.333333333333

Lvalues ​​dan Rvalues ​​di Lua

Ada dua jenis ekspresi di Lua -

  • lvalue- Ekspresi yang merujuk ke lokasi memori disebut ekspresi "lvalue". Nilai l dapat muncul sebagai sisi kiri atau kanan tugas.

  • rvalue- Istilah rvalue mengacu pada nilai data yang disimpan di beberapa alamat di memori. Nilai r adalah ekspresi yang tidak dapat memiliki nilai yang ditetapkan padanya, yang berarti nilai r dapat muncul di sisi kanan, tetapi tidak di sisi kiri tugas.

Variabel adalah lvalues ​​dan mungkin muncul di sisi kiri tugas. Literal numerik adalah nilai r sehingga mungkin tidak ditetapkan dan tidak dapat muncul di sisi kiri. Berikut ini adalah pernyataan yang valid -

g = 20

Tetapi berikut ini bukanlah pernyataan yang valid dan akan menghasilkan kesalahan waktu pembuatan -

10 = 20

Dalam bahasa pemrograman Lua, selain jenis tugas di atas, dimungkinkan untuk memiliki beberapa nilai l dan r dalam pernyataan tunggal yang sama. Itu ditunjukkan di bawah ini.

g,l = 20,30

Dalam pernyataan di atas, 20 untuk g dan 30 untuk l.

Lua adalah bahasa yang diketik secara dinamis, jadi variabel tidak memiliki tipe, hanya nilai yang memiliki tipe. Nilai dapat disimpan dalam variabel, diteruskan sebagai parameter dan dikembalikan sebagai hasil.

Di Lua, meskipun kami tidak memiliki tipe data variabel, tetapi kami memiliki tipe untuk nilai. Daftar tipe data untuk nilai diberikan di bawah ini.

Sr Tidak Jenis Nilai & Deskripsi
1

nil

Digunakan untuk membedakan nilai dari memiliki beberapa data atau tidak ada (nihil) data.

2

boolean

Menyertakan benar dan salah sebagai nilai. Umumnya digunakan untuk pengecekan kondisi.

3

number

Mewakili bilangan real (titik mengambang presisi ganda).

4

string

Merupakan larik karakter.

5

function

Merupakan metode yang ditulis dalam C atau Lua.

6

userdata

Merepresentasikan data C yang berubah-ubah.

7

thread

Merepresentasikan rangkaian eksekusi independen dan digunakan untuk mengimplementasikan coroutine.

8

table

Mewakili array biasa, tabel simbol, set, record, grafik, pohon, dll., Dan mengimplementasikan array asosiatif. Itu bisa memiliki nilai apapun (kecuali nihil).

Jenis Fungsi

Di Lua, ada fungsi yang disebut 'tipe' yang memungkinkan kita untuk mengetahui tipe variabel. Beberapa contoh diberikan dalam kode berikut.

print(type("What is my type"))   --> string
t = 10

print(type(5.8*t))               --> number
print(type(true))                --> boolean
print(type(print))               --> function
print(type(nil))                 --> nil
print(type(type(ABC)))           --> string

Saat Anda membangun dan menjalankan program di atas, ini menghasilkan hasil sebagai berikut di Linux -

string
number
boolean
function
nil
string

Secara default, semua variabel akan menunjuk ke nihil sampai mereka diberi nilai atau diinisialisasi. Dalam Lua, string nol dan kosong dianggap benar dalam kasus pemeriksaan kondisi. Karenanya, Anda harus berhati-hati saat menggunakan operasi Boolean. Kita akan mengetahui lebih banyak menggunakan tipe-tipe ini di bab-bab selanjutnya.

Operator adalah simbol yang memberi tahu penerjemah untuk melakukan manipulasi matematika atau logika tertentu. Bahasa Lua kaya akan operator bawaan dan menyediakan tipe operator berikut -

  • Operator Aritmatika
  • Operator Relasional
  • Operator Logis
  • Operator Misc

Tutorial ini akan menjelaskan operator aritmatika, relasional, logika, dan lain-lain satu per satu.

Operator Aritmatika

Tabel berikut menunjukkan semua operator aritmatika yang didukung oleh bahasa Lua. Asumsikan variabelA memegang 10 dan variabel B memegang 20 lalu -

Tunjukkan Contoh

Operator Deskripsi Contoh
+ Menambahkan dua operan A + B akan menghasilkan 30
- Mengurangi operan kedua dari yang pertama A - B akan memberi -10
* Kalikan kedua operan A * B akan memberi 200
/ Bagilah pembilang dengan pembilangnya B / A akan memberi 2
% Modulus Operator dan sisa setelah pembagian integer B% A akan memberi 0
^ Operator Eksponen mengambil eksponen A ^ 2 akan menghasilkan 100
- Unary - operator bertindak sebagai negasi -A akan memberikan -10

Operator Relasional

Tabel berikut menunjukkan semua operator relasional yang didukung oleh bahasa Lua. Asumsikan variabelA memegang 10 dan variabel B memegang 20 lalu -

Tunjukkan Contoh

Operator Deskripsi Contoh
== Memeriksa apakah nilai dua operan sama atau tidak, jika ya maka kondisinya menjadi benar. (A == B) tidak benar.
~ = Memeriksa apakah nilai dua operan sama atau tidak, jika nilai tidak sama maka kondisi menjadi benar. (A ~ = B) benar.
> Memeriksa apakah nilai operan kiri lebih besar dari nilai operan kanan, jika ya maka kondisi menjadi benar. (A> B) tidak benar.
< Memeriksa apakah nilai operan kiri kurang dari nilai operan kanan, jika ya maka kondisinya menjadi benar. (A <B) benar.
> = Memeriksa apakah nilai operan kiri lebih besar dari atau sama dengan nilai operan kanan, jika ya maka kondisi menjadi benar. (A> = B) tidak benar.
<= Memeriksa apakah nilai operan kiri kurang dari atau sama dengan nilai operan kanan, jika ya maka kondisi menjadi benar. (A <= B) benar.

Operator Logis

Tabel berikut menunjukkan semua operator logika yang didukung oleh bahasa Lua. Asumsikan variabelA berlaku dan variabel B tahan salah kalau begitu -

Tunjukkan Contoh

Operator Deskripsi Contoh
dan Disebut Logical AND operator. Jika kedua operan bukan nol maka kondisi menjadi benar. (A dan B) salah.
atau Disebut Logical OR Operator. Jika salah satu dari dua operan bukan nol maka kondisi menjadi benar. (A atau B) benar.
tidak Disebut Logical NOT Operator. Gunakan untuk membalikkan keadaan logis operannya. Jika kondisi benar maka operator NOT akan membuat salah. ! (A dan B) benar.

Operator Misc

Operator Miscellaneous yang didukung oleh Lua Language termasuk concatenation dan length.

Tunjukkan Contoh

Operator Deskripsi Contoh
.. Menggabungkan dua string. a..b dimana a adalah "Hello" dan b adalah "World", akan menghasilkan "Hello World".
# Operator unary yang mengembalikan panjang string atau tabel. # "Hello" akan menghasilkan 5

Diutamakan Operator di Lua

Prioritas operator menentukan pengelompokan istilah dalam ekspresi. Ini memengaruhi bagaimana ekspresi dievaluasi. Operator tertentu memiliki prioritas lebih tinggi daripada yang lain; misalnya, operator perkalian memiliki prioritas yang lebih tinggi daripada operator penjumlahan -

Misalnya, x = 7 + 3 * 2; Di sini x ditetapkan 13, bukan 20 karena operator * memiliki prioritas lebih tinggi dari + jadi pertama-tama dikalikan dengan 3 * 2 dan kemudian dijumlahkan menjadi 7.

Di sini, operator dengan prioritas tertinggi muncul di bagian atas tabel, operator dengan prioritas terendah muncul di bagian bawah. Dalam ekspresi, operator dengan prioritas lebih tinggi akan dievaluasi terlebih dahulu.

Tunjukkan Contoh

Kategori Operator Asosiatif
Unary bukan # - Kanan ke kiri
Rangkaian .. Kanan ke kiri
Perkalian * /% Kiri ke kanan
Aditif + - Kiri ke kanan
Relasional <> <=> = == ~ =  Kiri ke kanan
Persamaan == ~ = Kiri ke kanan
DAN logis dan Kiri ke kanan
Logis ATAU atau Kiri ke kanan

Mungkin ada situasi ketika Anda perlu mengeksekusi blok kode beberapa kali. Secara umum, pernyataan dieksekusi secara berurutan: pernyataan pertama dalam suatu fungsi dijalankan pertama, diikuti oleh yang kedua, dan seterusnya.

Bahasa pemrograman menyediakan berbagai struktur kontrol yang memungkinkan jalur eksekusi yang lebih rumit.

Pernyataan loop memungkinkan kita untuk mengeksekusi pernyataan atau sekelompok pernyataan beberapa kali. Berikut adalah bentuk umum dari pernyataan loop di sebagian besar bahasa pemrograman -

Lua menyediakan tipe loop berikut untuk menangani kebutuhan looping.

Sr.No. Jenis & Deskripsi Loop
1 while loop

Mengulangi pernyataan atau sekelompok pernyataan saat kondisi tertentu benar. Ini menguji kondisi sebelum menjalankan badan perulangan.

2 untuk loop

Menjalankan urutan pernyataan beberapa kali dan menyingkat kode yang mengelola variabel loop.

3 ulangi ... sampai loop

Mengulangi operasi grup pernyataan sampai kondisi terpenuhi.

4 loop bersarang

Anda dapat menggunakan satu atau lebih loop di dalam while lainnya , for atau do.. while loop.

Pernyataan Kontrol Loop

Pernyataan kontrol loop mengubah eksekusi dari urutan normalnya. Saat eksekusi meninggalkan ruang lingkup, semua objek otomatis yang dibuat dalam lingkup itu dimusnahkan.

Lua mendukung pernyataan kontrol berikut.

Sr.No. Pernyataan & Deskripsi Kontrol
1 pernyataan istirahat

Menghentikan loop dan mentransfer eksekusi ke pernyataan segera setelah loop atau switch.

Loop Tak Terbatas

Pengulangan menjadi pengulangan tanpa batas jika suatu kondisi tidak pernah menjadi salah. Ituwhileloop sering digunakan untuk tujuan ini. Karena kami langsung memberikan true untuk kondisi tersebut, maka terus dijalankan selamanya. Kita bisa menggunakan pernyataan break untuk memutuskan loop ini.

while( true )
do
   print("This loop will run forever.")
end

Struktur pengambilan keputusan mengharuskan programmer menentukan satu atau lebih kondisi untuk dievaluasi atau diuji oleh program, bersama dengan pernyataan atau pernyataan yang akan dieksekusi, jika kondisi ditentukan benar, dan opsional, pernyataan lain yang akan dieksekusi jika kondisi ditentukan sebagai salah.

Berikut ini adalah bentuk umum dari struktur pengambilan keputusan khas yang ditemukan di sebagian besar bahasa pemrograman -

Bahasa pemrograman Lua mengasumsikan kombinasi Boolean apa saja true dan non-nil nilai sebagai true, dan jika boolean false atau nil, maka diasumsikan sebagai falsenilai. Perlu dicatat bahwa di Lua,zero will be considered as true.

Bahasa pemrograman Lua menyediakan jenis pernyataan pengambilan keputusan berikut.

Sr.No. Pernyataan & Deskripsi
1 jika pernyataan

Sebuah jika pernyataan terdiri dari ekspresi boolean diikuti oleh satu atau lebih pernyataan.

2 jika ... pernyataan lain

Sebuah jika pernyataan dapat diikuti oleh opsional lain pernyataan, yang mengeksekusi ketika ekspresi boolean adalah palsu.

3 pernyataan if bersarang

Anda dapat menggunakan satu if atau else if pernyataan di dalam yang lain if atau else if pernyataan (s).

Fungsi adalah sekelompok pernyataan yang bersama-sama melakukan tugas. Anda dapat membagi kode Anda menjadi beberapa fungsi terpisah. Bagaimana Anda membagi kode di antara fungsi yang berbeda terserah Anda, tetapi secara logika pembagian biasanya unik, sehingga setiap fungsi melakukan tugas tertentu.

Bahasa Lua menyediakan banyak metode bawaan yang dapat dipanggil oleh program Anda. Misalnya, metodeprint() untuk mencetak argumen yang diteruskan sebagai masukan di konsol.

Suatu fungsi dikenal dengan berbagai nama seperti metode atau sub-rutin atau prosedur, dll.

Mendefinisikan Fungsi

Bentuk umum dari definisi metode dalam bahasa pemrograman Lua adalah sebagai berikut -

optional_function_scope function function_name( argument1, argument2, argument3........, 
argumentn)
function_body
return result_params_comma_separated
end

Definisi metode dalam bahasa pemrograman Lua terdiri dari header metode dan badan metode . Inilah semua bagian dari sebuah metode -

  • Optional Function Scope- Anda dapat menggunakan kata kunci lokal untuk membatasi cakupan fungsi atau mengabaikan bagian cakupan, yang akan menjadikannya fungsi global.

  • Function Name- Ini adalah nama sebenarnya dari fungsinya. Nama fungsi dan daftar parameter bersama-sama membentuk tanda tangan fungsi.

  • Arguments- Argumen seperti placeholder. Saat suatu fungsi dipanggil, Anda meneruskan nilai ke argumen. Nilai ini disebut sebagai parameter atau argumen sebenarnya. Daftar parameter mengacu pada jenis, urutan, dan jumlah argumen dari suatu metode. Argumen bersifat opsional; artinya, suatu metode mungkin tidak berisi argumen.

  • Function Body - Tubuh metode berisi kumpulan pernyataan yang menentukan apa yang dilakukan metode.

  • Return - Dalam Lua, dimungkinkan untuk mengembalikan beberapa nilai dengan mengikuti kata kunci kembali dengan nilai kembali yang dipisahkan koma.

Contoh

Berikut ini adalah kode sumber untuk fungsi yang dipanggil max(). Fungsi ini mengambil dua parameter num1 dan num2 dan mengembalikan maksimum antara keduanya -

--[[ function returning the max between two numbers --]]
function max(num1, num2)

   if (num1 > num2) then
      result = num1;
   else
      result = num2;
   end

   return result; 
end

Argumen Fungsi

Jika suatu fungsi akan menggunakan argumen, ia harus mendeklarasikan variabel yang menerima nilai argumen. Variabel ini disebutformal parameters dari fungsinya.

Parameter formal berperilaku seperti variabel lokal lainnya di dalam fungsi dan dibuat saat masuk ke fungsi dan dimusnahkan saat keluar.

Memanggil Fungsi

Saat membuat fungsi Lua, Anda memberikan definisi tentang apa yang harus dilakukan fungsi tersebut. Untuk menggunakan metode, Anda harus memanggil fungsi itu untuk melakukan tugas yang ditentukan.

Ketika program memanggil suatu fungsi, kontrol program dipindahkan ke fungsi yang dipanggil. Fungsi yang dipanggil melakukan tugas yang ditentukan dan ketika pernyataan kembaliannya dijalankan atau ketika fungsinya berakhir, ia mengembalikan kontrol program ke program utama.

Untuk memanggil metode, Anda hanya perlu meneruskan parameter yang diperlukan bersama dengan nama metode dan jika metode mengembalikan nilai, Anda dapat menyimpan nilai yang dikembalikan. Misalnya -

function max(num1, num2)

   if (num1 > num2) then
      result = num1;
   else
      result = num2;
   end

   return result; 
end

-- calling a function
print("The maximum of the two numbers is ",max(10,4))
print("The maximum of the two numbers is ",max(5,6))

Saat kita menjalankan kode di atas, kita akan mendapatkan output sebagai berikut.

The maximum of the two numbers is 	10
The maximum of the two numbers is 	6

Menetapkan dan Meneruskan Fungsi

Dalam Lua, kita dapat menetapkan fungsi ke variabel dan juga dapat mengirimkannya sebagai parameter fungsi lain. Berikut adalah contoh sederhana untuk menetapkan dan meneruskan fungsi sebagai parameter di Lua.

myprint = function(param)
   print("This is my print function -   ##",param,"##")
end

function add(num1,num2,functionPrint)
   result = num1 + num2
   functionPrint(result)
end

myprint(10)
add(2,5,myprint)

Saat kita menjalankan kode di atas, kita akan mendapatkan output sebagai berikut.

This is my print function -   ##	10	##
This is my print function -   ##	7	##

Fungsi dengan Argumen Variabel

Dimungkinkan untuk membuat fungsi dengan argumen variabel di Lua menggunakan '...' sebagai parameternya. Kita bisa memahami ini dengan melihat contoh di mana fungsi akan mengembalikan rata-rata dan bisa mengambil argumen variabel.

function average(...)
   result = 0
   local arg = {...}
   for i,v in ipairs(arg) do
      result = result + v
   end
   return result/#arg
end

print("The average is",average(10,5,3,4,5,6))

Saat kita menjalankan kode di atas, kita akan mendapatkan output sebagai berikut.

The average is	5.5

String adalah urutan karakter serta karakter kontrol seperti umpan formulir. String dapat diinisialisasi dengan tiga bentuk yang meliputi -

  • Karakter di antara tanda kutip tunggal
  • Karakter di antara tanda kutip ganda
  • Karakter antara [[dan]]

Contoh untuk ketiga formulir di atas ditunjukkan di bawah ini.

string1 = "Lua"
print("\"String 1 is\"",string1)

string2 = 'Tutorial'
print("String 2 is",string2)

string3 = [["Lua Tutorial"]]
print("String 3 is",string3)

Saat kita menjalankan program di atas, kita akan mendapatkan output sebagai berikut.

"String 1 is" Lua
String 2 is	Tutorial
String 3 is	"Lua Tutorial"

Karakter urutan melarikan diri digunakan dalam string untuk mengubah interpretasi karakter normal. Sebagai contoh, untuk mencetak koma terbalik ganda (""), kita telah menggunakan \ "pada contoh di atas. Urutan pelolosan dan penggunaannya tercantum di bawah ini dalam tabel.

Urutan pelarian Menggunakan
\Sebuah lonceng
\ b Menghapus
\ f Formfeed
\ n Garis baru
\ r Kereta kembali
\ t Tab
\ v Tab vertikal
\\ Garis miring terbalik
\ " Tanda kutip ganda
\ ' Tanda kutip tunggal
\ [ Tanda kurung siku kiri
\] Braket persegi kanan

Manipulasi String

Lua mendukung string untuk memanipulasi string -

Sr.No. Metode & Tujuan
1

string.upper(argument)

Mengembalikan representasi yang dikapitalisasi dari argumen.

2

string.lower(argument)

Mengembalikan representasi huruf kecil dari argumen.

3

string.gsub(mainString,findString,replaceString)

Mengembalikan string dengan mengganti kemunculan findString dengan replaceString.

4

string.find(mainString,findString,

optionalStartIndex,optionalEndIndex)

Mengembalikan indeks awal dan indeks akhir dari findString dalam string utama dan nil jika tidak ditemukan.

5

string.reverse(arg)

Mengembalikan string dengan membalikkan karakter dari string yang dilewati.

6

string.format(...)

Mengembalikan string yang diformat.

7

string.char(arg) and string.byte(arg)

Mengembalikan representasi numerik dan karakter internal dari argumen input.

8

string.len(arg)

Mengembalikan panjang string yang diteruskan.

9

string.rep(string, n))

Mengembalikan sebuah string dengan mengulangi string yang sama sebanyak n kali.

10

..

Jadi operator menggabungkan dua string.

Sekarang, mari selami beberapa contoh untuk melihat dengan tepat bagaimana fungsi manipulasi string ini berperilaku.

Manipulasi Kasus

Kode contoh untuk memanipulasi string menjadi huruf besar dan kecil diberikan di bawah ini.

string1 = "Lua";

print(string.upper(string1))
print(string.lower(string1))

Saat kita menjalankan program di atas, kita akan mendapatkan output sebagai berikut.

LUA
lua

Mengganti Substring

Kode contoh untuk mengganti kemunculan satu string dengan yang lain diberikan di bawah ini.

string = "Lua Tutorial"

-- replacing strings
newstring = string.gsub(string,"Tutorial","Language")
print("The new string is "..newstring)

Saat kita menjalankan program di atas, kita akan mendapatkan output sebagai berikut.

The new string is Lua Language

Menemukan dan Membalik

Kode contoh untuk menemukan indeks substring dan membalikkan string diberikan di bawah ini.

string = "Lua Tutorial"

-- replacing strings
print(string.find(string,"Tutorial"))
reversedString = string.reverse(string)
print("The new string is",reversedString)

Saat kita menjalankan program di atas, kita akan mendapatkan output sebagai berikut.

5	12
The new string is	lairotuT auL

Memformat String

Sering kali dalam pemrograman kita, kita mungkin perlu mencetak string dalam format yang sudah ditentukan. Anda dapat menggunakan fungsi string.format untuk memformat keluaran seperti yang ditunjukkan di bawah ini.

string1 = "Lua"
string2 = "Tutorial"

number1 = 10
number2 = 20

-- Basic string formatting
print(string.format("Basic formatting %s %s",string1,string2))

-- Date formatting
date = 2; month = 1; year = 2014
print(string.format("Date formatting %02d/%02d/%03d", date, month, year))

-- Decimal formatting
print(string.format("%.4f",1/3))

Saat kita menjalankan program di atas, kita akan mendapatkan output sebagai berikut.

Basic formatting Lua Tutorial
Date formatting 02/01/2014
0.3333

Representasi Karakter dan Byte

Kode contoh untuk representasi karakter dan byte, yang digunakan untuk mengonversi string dari string ke representasi internal dan sebaliknya.

-- Byte conversion

-- First character
print(string.byte("Lua"))

-- Third character
print(string.byte("Lua",3))

-- first character from last
print(string.byte("Lua",-1))

-- Second character
print(string.byte("Lua",2))

-- Second character from last
print(string.byte("Lua",-2))

-- Internal Numeric ASCII Conversion
print(string.char(97))

Saat kita menjalankan program di atas, kita akan mendapatkan output sebagai berikut.

76
97
97
117
117
a

Fungsi Umum Lainnya

Manipulasi string yang umum termasuk penggabungan string, menemukan panjang string dan terkadang mengulang string yang sama beberapa kali. Contoh untuk operasi ini diberikan di bawah ini.

string1 = "Lua"
string2 = "Tutorial"

-- String Concatenations using ..
print("Concatenated string",string1..string2)

-- Length of string
print("Length of string1 is ",string.len(string1))

-- Repeating strings
repeatedString = string.rep(string1,3)
print(repeatedString)

Saat kita menjalankan program di atas, kita akan mendapatkan output sebagai berikut.

Concatenated string	LuaTutorial
Length of string1 is 	3
LuaLuaLua

Array adalah susunan objek yang berurutan, yang bisa berupa larik satu dimensi yang berisi kumpulan baris atau larik multi-dimensi yang berisi banyak baris dan kolom.

Dalam Lua, array diimplementasikan menggunakan tabel pengindeksan dengan integer. Ukuran array tidak tetap dan dapat bertambah berdasarkan kebutuhan kami, tunduk pada batasan memori.

Array Satu Dimensi

Array satu dimensi dapat direpresentasikan menggunakan struktur tabel sederhana dan dapat diinisialisasi dan dibaca dengan sederhana forlingkaran. Contohnya ditunjukkan di bawah ini.

array = {"Lua", "Tutorial"}

for i = 0, 2 do
   print(array[i])
end

Ketika kami menjalankan kode di atas, kami akan mendapatkan output berikut.

nil
Lua
Tutorial

Seperti yang Anda lihat pada kode di atas, ketika kita mencoba mengakses elemen dalam indeks yang tidak ada di larik, hasilnya nihil. Dalam Lua, pengindeksan umumnya dimulai pada indeks 1. Tetapi dimungkinkan untuk membuat objek pada indeks 0 dan di bawah 0 juga. Array menggunakan indeks negatif ditunjukkan di bawah ini di mana kita menginisialisasi array menggunakan for loop.

array = {}

for i= -2, 2 do
   array[i] = i *2
end

for i = -2,2 do
   print(array[i])
end

Saat kita menjalankan kode di atas, kita akan mendapatkan output sebagai berikut.

-4
-2
0
2
4

Array Multi-Dimensi

Array multi-dimensi dapat diimplementasikan dengan dua cara.

  • Array array
  • Array berdimensi tunggal dengan memanipulasi indeks

Contoh untuk array multidimensi 3. 3 ditunjukkan di bawah ini menggunakan array dari array.

-- Initializing the array
array = {}

for i=1,3 do
   array[i] = {}
	
   for j=1,3 do
      array[i][j] = i*j
   end
	
end

-- Accessing the array

for i=1,3 do

   for j=1,3 do
      print(array[i][j])
   end
	
end

Saat kita menjalankan kode di atas, kita akan mendapatkan output sebagai berikut.

1
2
3
2
4
6
3
6
9

Contoh untuk array multidimensi ditunjukkan di bawah ini menggunakan indeks manipulasi.

-- Initializing the array

array = {}

maxRows = 3
maxColumns = 3

for row=1,maxRows do

   for col=1,maxColumns do
      array[row*maxColumns +col] = row*col
   end
	
end

-- Accessing the array

for row=1,maxRows do

   for col=1,maxColumns do
      print(array[row*maxColumns +col])
   end
	
end

Saat kita menjalankan kode di atas, kita akan mendapatkan output sebagai berikut.

1
2
3
2
4
6
3
6
9

Seperti yang Anda lihat pada contoh di atas, data disimpan berdasarkan indeks. Dimungkinkan untuk menempatkan elemen-elemen dengan cara yang jarang dan itu adalah cara implementasi Lua dari sebuah matriks bekerja. Karena tidak menyimpan nilai nil di Lua, dimungkinkan untuk menghemat banyak memori tanpa teknik khusus di Lua dibandingkan dengan teknik khusus yang digunakan dalam bahasa pemrograman lain.

Iterator adalah konstruksi yang memungkinkan Anda melintasi elemen yang disebut collection atau container. Dalam Lua, kumpulan ini sering mengacu pada tabel, yang digunakan untuk membuat berbagai struktur data seperti array.

Generik Untuk Iterator

Generik untuk iterator menyediakan pasangan nilai kunci dari setiap elemen dalam koleksi. Contoh sederhana diberikan di bawah ini.

array = {"Lua", "Tutorial"}

for key,value in ipairs(array) 
do
   print(key, value)
end

Ketika kami menjalankan kode di atas, kami akan mendapatkan output berikut -

1  Lua
2  Tutorial

Contoh di atas menggunakan fungsi iterator ipairs default yang disediakan oleh Lua.

Dalam Lua kami menggunakan fungsi untuk merepresentasikan iterator. Berdasarkan pemeliharaan status dalam fungsi iterator ini, kami memiliki dua tipe utama -

  • Iterator tanpa kewarganegaraan
  • Iterator Stateful

Iterator tanpa kewarganegaraan

Dengan namanya sendiri kita dapat memahami bahwa jenis fungsi iterator ini tidak mempertahankan status apa pun.

Sekarang mari kita lihat contoh pembuatan iterator kita sendiri menggunakan fungsi sederhana yang mencetak kuadrat n nomor.

function square(iteratorMaxCount,currentNumber)

   if currentNumber<iteratorMaxCount
   then
      currentNumber = currentNumber+1
      return currentNumber, currentNumber*currentNumber
   end
	
end

for i,n in square,3,0
do
   print(i,n)
end

Saat kita menjalankan program di atas, kita akan mendapatkan output sebagai berikut.

1	1
2	4
3	9

Kode di atas dapat sedikit dimodifikasi untuk meniru cara kerja fungsi ipairs dari iterator. Itu ditunjukkan di bawah ini.

function square(iteratorMaxCount,currentNumber)

   if currentNumber<iteratorMaxCount
   then
      currentNumber = currentNumber+1
      return currentNumber, currentNumber*currentNumber
   end
	
end

function squares(iteratorMaxCount)
   return square,iteratorMaxCount,0
end  

for i,n in squares(3)
do 
   print(i,n)
end

Saat kita menjalankan program di atas, kita akan mendapatkan output sebagai berikut.

1	1
2	4
3	9

Iterator Stateful

Contoh sebelumnya dari iterasi menggunakan fungsi tidak mempertahankan status. Setiap kali fungsi dipanggil, ia mengembalikan elemen koleksi berikutnya berdasarkan variabel kedua yang dikirim ke fungsi. Untuk menahan status elemen saat ini, closure digunakan. Penutupan mempertahankan nilai variabel di seluruh pemanggilan fungsi. Untuk membuat closure baru, kita membuat dua fungsi termasuk closure itu sendiri dan pabrik, fungsi yang membuat closure.

Sekarang mari kita lihat contoh pembuatan iterator kita sendiri di mana kita akan menggunakan closure.

array = {"Lua", "Tutorial"}

function elementIterator (collection)

   local index = 0
   local count = #collection
	
   -- The closure function is returned
	
   return function ()
      index = index + 1
		
      if index <= count
      then
         -- return the current element of the iterator
         return collection[index]
      end
		
   end
	
end

for element in elementIterator(array)
do
   print(element)
end

Saat kita menjalankan program di atas, kita akan mendapatkan output sebagai berikut.

Lua
Tutorial

Dalam contoh di atas, kita dapat melihat bahwa elementIterator memiliki metode lain di dalamnya yang menggunakan indeks variabel eksternal lokal dan menghitung untuk mengembalikan setiap elemen dalam kumpulan dengan menaikkan indeks setiap kali fungsi dipanggil.

Kita dapat membuat iterator fungsi kita sendiri menggunakan closure seperti yang ditunjukkan di atas dan dapat mengembalikan banyak elemen untuk setiap kali kita mengulang melalui koleksi.

pengantar

Tabel adalah satu-satunya struktur data yang tersedia di Lua yang membantu kita membuat tipe yang berbeda seperti array dan kamus. Lua menggunakan array asosiatif dan yang dapat diindeks tidak hanya dengan angka tetapi juga dengan string kecuali nil. Meja tidak memiliki ukuran tetap dan dapat tumbuh sesuai kebutuhan kita.

Lua menggunakan tabel dalam semua representasi termasuk representasi paket. Ketika kita mengakses sebuah metode string.format, artinya kita sedang mengakses fungsi format yang tersedia dalam paket string.

Representasi dan Penggunaan

Tabel disebut objek dan bukan nilai maupun variabel. Lua menggunakan ekspresi konstruktor {} untuk membuat tabel kosong. Perlu diketahui bahwa tidak ada hubungan tetap antara variabel yang memiliki referensi tabel dan tabel itu sendiri.

--sample table initialization
mytable = {}

--simple table value assignment
mytable[1]= "Lua"

--removing reference
mytable = nil

-- lua garbage collection will take care of releasing memory

Saat kita punya meja a dengan set elemen dan jika kita menugaskannya b, keduanya a dan bmengacu pada memori yang sama. Tidak ada memori terpisah yang dialokasikan secara terpisah untuk b. Jika a diatur ke nihil, tabel akan tetap dapat diakses oleh b. Jika tidak ada referensi ke sebuah tabel, maka pengumpulan sampah di Lua akan menangani proses pembersihan untuk membuat memori yang tidak direferensikan ini dapat digunakan kembali.

Contoh ditunjukkan di bawah untuk menjelaskan fitur tabel yang disebutkan di atas.

-- Simple empty table
mytable = {}
print("Type of mytable is ",type(mytable))

mytable[1]= "Lua"
mytable["wow"] = "Tutorial"

print("mytable Element at index 1 is ", mytable[1])
print("mytable Element at index wow is ", mytable["wow"])

-- alternatetable and mytable refers to same table
alternatetable = mytable

print("alternatetable Element at index 1 is ", alternatetable[1])
print("alternatetable Element at index wow is ", alternatetable["wow"])

alternatetable["wow"] = "I changed it"

print("mytable Element at index wow is ", mytable["wow"])

-- only variable released and and not table
alternatetable = nil
print("alternatetable is ", alternatetable)

-- mytable is still accessible
print("mytable Element at index wow is ", mytable["wow"])

mytable = nil
print("mytable is ", mytable)

Saat kita menjalankan program di atas, kita akan mendapatkan output berikut -

Type of mytable is 	table
mytable Element at index 1 is 	Lua
mytable Element at index wow is 	Tutorial
alternatetable Element at index 1 is 	Lua
alternatetable Element at index wow is 	Tutorial
mytable Element at index wow is 	I changed it
alternatetable is 	nil
mytable Element at index wow is 	I changed it
mytable is 	nil

Manipulasi Tabel

Ada fungsi bawaan untuk manipulasi tabel dan mereka tercantum dalam tabel berikut.

Sr.No. Metode & Tujuan
1

table.concat (table [, sep [, i [, j]]])

Menggabungkan string dalam tabel berdasarkan parameter yang diberikan. Lihat contoh untuk detailnya.

2

table.insert (table, [pos,] value)

Menyisipkan nilai ke dalam tabel pada posisi yang ditentukan.

3

table.maxn (table)

Menampilkan indeks numerik terbesar.

4

table.remove (table [, pos])

Menghapus nilai dari tabel.

5

table.sort (table [, comp])

Mengurutkan tabel berdasarkan argumen pembanding opsional.

Mari kita lihat beberapa contoh fungsi di atas.

Tabel Concatenation

Kita bisa menggunakan fungsi concat untuk menggabungkan dua tabel seperti yang ditunjukkan di bawah ini -

fruits = {"banana","orange","apple"}

-- returns concatenated string of table
print("Concatenated string ",table.concat(fruits))

--concatenate with a character
print("Concatenated string ",table.concat(fruits,", "))

--concatenate fruits based on index
print("Concatenated string ",table.concat(fruits,", ", 2,3))

Saat kita menjalankan program di atas, kita akan mendapatkan output berikut -

Concatenated string 	bananaorangeapple
Concatenated string 	banana, orange, apple
Concatenated string 	orange, apple

Sisipkan dan Hapus

Penyisipan dan penghapusan item dalam tabel paling umum terjadi dalam manipulasi tabel. Ini dijelaskan di bawah.

fruits = {"banana","orange","apple"}

-- insert a fruit at the end
table.insert(fruits,"mango")
print("Fruit at index 4 is ",fruits[4])

--insert fruit at index 2
table.insert(fruits,2,"grapes")
print("Fruit at index 2 is ",fruits[2])

print("The maximum elements in table is",table.maxn(fruits))

print("The last element is",fruits[5])

table.remove(fruits)
print("The previous last element is",fruits[5])

Saat kita menjalankan program di atas, kita akan mendapatkan output berikut -

Fruit at index 4 is 	mango
Fruit at index 2 is 	grapes
The maximum elements in table is	5
The last element is	mango
The previous last element is	nil

Tabel Sortasi

Kami sering kali perlu mengurutkan tabel dalam urutan tertentu. Fungsi sortir mengurutkan elemen dalam tabel menurut abjad. Contoh untuk ini ditunjukkan di bawah.

fruits = {"banana","orange","apple","grapes"}

for k,v in ipairs(fruits) do
   print(k,v)
end

table.sort(fruits)
print("sorted table")

for k,v in ipairs(fruits) do
   print(k,v)
end

Saat kita menjalankan program di atas, kita akan mendapatkan output berikut -

1	banana
2	orange
3	apple
4	grapes
sorted table
1	apple
2	banana
3	grapes
4	orange

Apa itu Modul?

Module seperti pustaka yang dapat dimuat menggunakan require dan memiliki satu nama global yang berisi tabel. Modul ini dapat terdiri dari beberapa fungsi dan variabel. Semua fungsi dan variabel ini digabungkan ke dalam tabel, yang berfungsi sebagai namespace. Juga, modul yang berperilaku baik memiliki ketentuan yang diperlukan untuk mengembalikan tabel ini pada saat diminta.

Khusus Modul Lua

Penggunaan tabel dalam modul membantu kita dalam banyak cara dan memungkinkan kita untuk memanipulasi modul dengan cara yang sama kita memanipulasi tabel Lua lainnya. Sebagai hasil dari kemampuannya untuk memanipulasi modul, ia menyediakan fitur tambahan yang bahasa lain memerlukan mekanisme khusus. Karena mekanisme modul gratis di Lua ini, pengguna dapat memanggil fungsi di Lua dengan berbagai cara. Beberapa di antaranya ditampilkan di bawah.

-- Assuming we have a module printFormatter
-- Also printFormatter has a funtion simpleFormat(arg)
-- Method 1
require "printFormatter"
printFormatter.simpleFormat("test")

-- Method 2
local formatter = require "printFormatter"
formatter.simpleFormat("test")

-- Method 3
require "printFormatter"
local formatterFunction = printFormatter.simpleFormat
formatterFunction("test")

Dalam contoh kode di atas, Anda dapat melihat seberapa fleksibel pemrograman di Lua, tanpa kode tambahan khusus.

Fungsi yang dibutuhkan

Lua telah menyediakan fungsi tingkat tinggi yang disebut require untuk memuat semua modul yang diperlukan. Itu dibuat sesederhana mungkin untuk menghindari terlalu banyak informasi pada modul untuk memuatnya. Fungsi yang dibutuhkan hanya mengasumsikan modul sebagai potongan kode yang mendefinisikan beberapa nilai, yang sebenarnya merupakan fungsi atau tabel yang berisi fungsi.

Contoh

Mari kita perhatikan contoh sederhana, di mana satu fungsi memiliki fungsi matematika. Mari kita sebut modul ini sebagai mymath dan nama file menjadi mymath.lua. Isi file adalah sebagai berikut -

local mymath =  {}

function mymath.add(a,b)
   print(a+b)
end

function mymath.sub(a,b)
   print(a-b)
end

function mymath.mul(a,b)
   print(a*b)
end

function mymath.div(a,b)
   print(a/b)
end

return mymath

Sekarang, untuk mengakses modul Lua ini di file lain, katakanlah, moduletutorial.lua, Anda perlu menggunakan segmen kode berikut.

mymathmodule = require("mymath")
mymathmodule.add(10,20)
mymathmodule.sub(30,20)
mymathmodule.mul(10,20)
mymathmodule.div(30,20)

Untuk menjalankan kode ini, kita perlu menempatkan dua file Lua dalam direktori yang sama atau sebagai alternatif, Anda dapat menempatkan file modul di jalur paket dan membutuhkan pengaturan tambahan. Saat kita menjalankan program di atas, kita akan mendapatkan output sebagai berikut.

30
10
200
1.5

Hal-hal untuk diingat

  • Tempatkan modul dan file yang Anda jalankan di direktori yang sama.

  • Nama modul dan nama filenya harus sama.

  • Ini adalah praktik terbaik untuk mengembalikan modul untuk fungsi require dan karenanya modul sebaiknya diimplementasikan seperti yang ditunjukkan di atas meskipun Anda dapat menemukan jenis implementasi lain di tempat lain.

Cara Lama Menerapkan Modul

Izinkan saya sekarang menulis ulang contoh yang sama dengan cara yang lebih lama, yang menggunakan implementasi package.seeall. Ini digunakan di Lua versi 5.1 dan 5.0. Modul mymath ditampilkan di bawah ini.

module("mymath", package.seeall)

function mymath.add(a,b)
   print(a+b)
end

function mymath.sub(a,b)
   print(a-b)
end

function mymath.mul(a,b)
   print(a*b)
end

function mymath.div(a,b)
   print(a/b)
end

Penggunaan modul dalam moduletutorial.lua ditunjukkan di bawah ini.

require("mymath")
mymath.add(10,20)
mymath.sub(30,20)
mymath.mul(10,20)
mymath.div(30,20)

Ketika kita menjalankan di atas, kita akan mendapatkan hasil yang sama. Tetapi disarankan untuk menggunakan versi kode yang lebih lama dan dianggap kurang aman. Banyak SDK yang menggunakan Lua untuk pemrograman seperti Corona SDK telah menghentikan penggunaan ini.

Metatable adalah tabel yang membantu dalam mengubah perilaku tabel yang dilampirkan dengan bantuan set kunci dan metode meta terkait. Metode meta ini adalah fungsionalitas Lua yang kuat yang mengaktifkan fitur seperti -

  • Mengubah / menambahkan fungsionalitas ke operator di atas tabel.

  • Mencari metatabel saat kunci tidak tersedia di tabel menggunakan __index di metatable.

Ada dua metode penting yang digunakan dalam menangani metatabel yang meliputi -

  • setmetatable(table,metatable) - Metode ini digunakan untuk mengatur metatabel untuk sebuah tabel.

  • getmetatable(table) - Metode ini digunakan untuk mendapatkan metatabel dari sebuah tabel.

Pertama-tama, mari kita lihat bagaimana mengatur satu tabel sebagai metatabel dari tabel lainnya. Itu ditunjukkan di bawah ini.

mytable = {}
mymetatable = {}
setmetatable(mytable,mymetatable)

Kode di atas dapat direpresentasikan dalam satu baris seperti yang ditunjukkan di bawah ini.

mytable = setmetatable({},{})

_indeks

Contoh sederhana metatabel untuk mencari tabel meta ketika tidak tersedia di tabel ditunjukkan di bawah ini.

mytable = setmetatable({key1 = "value1"}, {
   __index = function(mytable, key)
	
      if key == "key2" then
         return "metatablevalue"
      else
         return mytable[key]
      end
   end
})

print(mytable.key1,mytable.key2)

Saat kita menjalankan program di atas, kita akan mendapatkan output sebagai berikut.

value1 metatablevalue

Mari kita jelaskan apa yang terjadi pada contoh di atas dalam langkah-langkah.

  • Tabel mytable di sini {key1 = "value1"}.

  • Metatable disetel untuk mytable yang berisi fungsi untuk __index, yang kita sebut sebagai metamethod.

  • Metamethod melakukan pekerjaan sederhana untuk mencari indeks "key2", jika ditemukan, ia mengembalikan "metatablevalue", jika tidak mengembalikan nilai mytable untuk indeks yang sesuai.

Kami dapat memiliki versi sederhana dari program di atas seperti yang ditunjukkan di bawah ini.

mytable = setmetatable({key1 = "value1"}, 
   { __index = { key2 = "metatablevalue" } })
print(mytable.key1,mytable.key2)

__newindex

Saat kami menambahkan __newindex ke metatable, jika kunci tidak tersedia di tabel, perilaku kunci baru akan ditentukan oleh metode meta. Contoh sederhana di mana indeks metatable diatur ketika indeks tidak tersedia di tabel utama diberikan di bawah ini.

mymetatable = {}
mytable = setmetatable({key1 = "value1"}, { __newindex = mymetatable })

print(mytable.key1)

mytable.newkey = "new value 2"
print(mytable.newkey,mymetatable.newkey)

mytable.key1 = "new  value 1"
print(mytable.key1,mymetatable.newkey1)

Ketika Anda menjalankan program di atas, Anda mendapatkan output berikut.

value1
nil	new value 2
new  value 1	nil

Anda dapat melihat di program di atas, jika ada kunci di tabel utama, itu hanya memperbaruinya. Ketika sebuah kunci tidak tersedia di dalam maintable, ia menambahkan kunci tersebut ke metatabel.

Contoh lain yang memperbarui tabel yang sama menggunakan fungsi rawset ditunjukkan di bawah ini.

mytable = setmetatable({key1 = "value1"}, {

   __newindex = function(mytable, key, value)
      rawset(mytable, key, "\""..value.."\"")
   end
})

mytable.key1 = "new value"
mytable.key2 = 4

print(mytable.key1,mytable.key2)

Saat kita menjalankan program di atas kita akan mendapatkan output sebagai berikut.

new value	"4"

nilai set rawset tanpa menggunakan __newindex dari metatable. Demikian pula ada rawget yang mendapatkan nilai tanpa menggunakan __index.

Menambahkan Perilaku Operator ke Tabel

Contoh sederhana untuk menggabungkan dua tabel menggunakan + operator ditunjukkan di bawah ini -

mytable = setmetatable({ 1, 2, 3 }, {
   __add = function(mytable, newtable)
	
      for i = 1, table.maxn(newtable) do
         table.insert(mytable, table.maxn(mytable)+1,newtable[i])
      end
      return mytable
   end
})

secondtable = {4,5,6}

mytable = mytable + secondtable

for k,v in ipairs(mytable) do
   print(k,v)
end

Saat kita menjalankan program di atas, kita akan mendapatkan output sebagai berikut.

1	1
2	2
3	3
4	4
5	5
6	6

Kunci __add disertakan dalam metatabel untuk menambahkan perilaku operator +. Tabel kunci dan operator terkait ditampilkan di bawah ini.

Sr.No. Mode & Deskripsi
1

__add

Mengubah perilaku operator '+'.

2

__sub

Mengubah perilaku operator '-'.

3

__mul

Mengubah perilaku operator '*'.

4

__div

Mengubah perilaku operator '/'.

5

__mod

Mengubah perilaku operator '%'.

6

__unm

Mengubah perilaku operator '-'.

7

__concat

Mengubah perilaku operator '..'.

8

__eq

Mengubah perilaku operator '=='.

9

__lt

Mengubah perilaku operator '<'.

10

__le

Mengubah perilaku operator '<='.

__panggilan

Menambahkan perilaku pemanggilan metode dilakukan menggunakan pernyataan __call. Contoh sederhana yang mengembalikan jumlah nilai dalam tabel utama dengan tabel yang diteruskan.

mytable = setmetatable({10}, {
   __call = function(mytable, newtable)
   sum = 0
	
      for i = 1, table.maxn(mytable) do
         sum = sum + mytable[i]
      end
	
      for i = 1, table.maxn(newtable) do
         sum = sum + newtable[i]
      end
	
      return sum
   end
})

newtable = {10,20,30}
print(mytable(newtable))

Saat kita menjalankan program di atas, kita akan mendapatkan output sebagai berikut.

70

__tostring

Untuk mengubah perilaku pernyataan cetak, kita dapat menggunakan metode __tostring. Contoh sederhana ditunjukkan di bawah ini.

mytable = setmetatable({ 10, 20, 30 }, {
   __tostring = function(mytable)
   sum = 0
	
      for k, v in pairs(mytable) do
         sum = sum + v
      end
		
      return "The sum of values in the table is " .. sum
   end
})
print(mytable)

Saat kita menjalankan program di atas, kita akan mendapatkan output sebagai berikut.

The sum of values in the table is 60

Jika Anda mengetahui kemampuan tabel meta sepenuhnya, Anda benar-benar dapat melakukan banyak operasi yang akan menjadi sangat kompleks tanpa menggunakannya. Jadi, coba bekerja lebih banyak tentang penggunaan metatable dengan opsi berbeda yang tersedia di tabel meta seperti yang dijelaskan dalam sampel dan juga buat sampel Anda sendiri.

pengantar

Coroutine bersifat kolaboratif, yang memungkinkan dua atau lebih metode untuk dieksekusi secara terkontrol. Dengan coroutine, pada waktu tertentu, hanya satu coroutine yang berjalan dan coroutine yang sedang berjalan ini hanya menangguhkan eksekusinya jika secara eksplisit meminta untuk ditangguhkan.

Definisi di atas mungkin terlihat kabur. Mari kita asumsikan bahwa kita memiliki dua metode, satu metode program utama dan coroutine. Ketika kita memanggil coroutine menggunakan fungsi resume, itu mulai dijalankan dan ketika kita memanggil fungsi yield, itu menghentikan eksekusi. Sekali lagi coroutine yang sama dapat terus dijalankan dengan panggilan fungsi resume lain dari tempat ia ditangguhkan. Proses ini dapat berlanjut hingga akhir eksekusi coroutine.

Fungsi Tersedia di Coroutines

Tabel berikut mencantumkan semua fungsi yang tersedia untuk coroutine di Lua dan penggunaannya yang sesuai.

Sr.No. Metode & Tujuan
1

coroutine.create (f)

Membuat coroutine baru dengan fungsi f dan mengembalikan objek berjenis "utas".

2

coroutine.resume (co [, val1, ...])

Melanjutkan co coroutine dan meneruskan parameter jika ada. Ini mengembalikan status operasi dan nilai pengembalian opsional lainnya.

3

coroutine.running ()

Mengembalikan coroutine yang berjalan atau nil jika dipanggil di utas utama.

4

coroutine.status (co)

Mengembalikan salah satu nilai dari berjalan, normal, ditangguhkan, atau mati berdasarkan status coroutine.

5

coroutine.wrap (f)

Seperti coroutine.create, fungsi coroutine.wrap juga membuat coroutine, tetapi alih-alih mengembalikan coroutine itu sendiri, ia mengembalikan fungsi yang, ketika dipanggil, melanjutkan coroutine.

6

coroutine.yield (...)

Menangguhkan coroutine yang sedang berjalan. Parameter yang diteruskan ke metode ini bertindak sebagai nilai pengembalian tambahan ke fungsi resume.

Contoh

Mari kita lihat contoh untuk memahami konsep coroutine.

co = coroutine.create(function (value1,value2)
   local tempvar3 = 10
   print("coroutine section 1", value1, value2, tempvar3)
	
   local tempvar1 = coroutine.yield(value1+1,value2+1)
   tempvar3 = tempvar3 + value1
   print("coroutine section 2",tempvar1 ,tempvar2, tempvar3)
	
   local tempvar1, tempvar2= coroutine.yield(value1+value2, value1-value2)
   tempvar3 = tempvar3 + value1
   print("coroutine section 3",tempvar1,tempvar2, tempvar3)
   return value2, "end"
	
end)

print("main", coroutine.resume(co, 3, 2))
print("main", coroutine.resume(co, 12,14))
print("main", coroutine.resume(co, 5, 6))
print("main", coroutine.resume(co, 10, 20))

Saat kita menjalankan program di atas, kita akan mendapatkan output sebagai berikut.

coroutine section 1	3	2	10
main	true	4	3
coroutine section 2	12	nil	13
main	true	5	1
coroutine section 3	5	6	16
main	true	2	end
main	false	cannot resume dead coroutine

Apa yang Dilakukan Contoh Di Atas?

Seperti disebutkan sebelumnya, kami menggunakan fungsi resume untuk memulai operasi dan fungsi hasil untuk menghentikan operasi. Juga, Anda dapat melihat bahwa ada beberapa nilai kembali yang diterima oleh fungsi resume coroutine.

  • Pertama, kita membuat coroutine dan menugaskannya ke nama variabel co dan coroutine mengambil dua variabel sebagai parameternya.

  • Ketika kita memanggil fungsi resume pertama, nilai 3 dan 2 dipertahankan di variabel sementara nilai1 dan nilai2 sampai akhir coroutine.

  • Untuk membuat Anda memahami hal ini, kami telah menggunakan tempvar3, yang awalnya 10 dan diperbarui menjadi 13 dan 16 oleh panggilan berikutnya dari coroutine karena nilai1 dipertahankan sebagai 3 selama eksekusi coroutine.

  • Coroutine.yield pertama mengembalikan dua nilai 4 dan 3 ke fungsi resume, yang kita dapatkan dengan memperbarui input params 3 dan 2 dalam pernyataan yield. Ia juga menerima status benar / salah dari eksekusi coroutine.

  • Hal lain tentang coroutine adalah bagaimana parameter panggilan resume berikutnya ditangani, dalam contoh di atas; Anda dapat melihat bahwa variabel coroutine.yield menerima panggilan params berikutnya yang menyediakan cara yang efektif untuk melakukan operasi baru dengan retensi nilai param yang ada.

  • Terakhir, setelah semua pernyataan di coroutine dijalankan, panggilan berikutnya akan kembali dengan false dan pernyataan "tidak dapat melanjutkan coroutine mati" sebagai respons.

Contoh Coroutine Lainnya

Mari kita lihat coroutine sederhana yang mengembalikan angka dari 1 hingga 5 dengan bantuan fungsi yield dan fungsi resume. Ini membuat coroutine jika tidak tersedia atau melanjutkan coroutine yang ada.

function getNumber()
   local function getNumberHelper()
      co = coroutine.create(function ()
      coroutine.yield(1)
      coroutine.yield(2)
      coroutine.yield(3)
      coroutine.yield(4)
      coroutine.yield(5)
      end)
      return co
   end
	
   if(numberHelper) then
      status, number = coroutine.resume(numberHelper);
		
      if coroutine.status(numberHelper) == "dead" then
         numberHelper = getNumberHelper()
         status, number = coroutine.resume(numberHelper);
      end
		
      return number
   else
      numberHelper = getNumberHelper()
      status, number = coroutine.resume(numberHelper);
      return number
   end
	
end

for index = 1, 10 do
   print(index, getNumber())
end

Saat kita menjalankan program di atas, kita akan mendapatkan output sebagai berikut.

1	1
2	2
3	3
4	4
5	5
6	1
7	2
8	3
9	4
10	5

Seringkali ada perbandingan coroutine dengan utas bahasa multiprogram, tetapi kita perlu memahami bahwa coroutine memiliki fitur utas yang serupa tetapi mereka hanya mengeksekusi satu per satu dan tidak pernah mengeksekusi secara bersamaan.

Kami mengontrol urutan eksekusi program untuk memenuhi kebutuhan dengan ketentuan menyimpan informasi tertentu untuk sementara. Menggunakan variabel global dengan coroutine memberikan lebih banyak fleksibilitas pada coroutine.

Library I / O digunakan untuk membaca dan memanipulasi file di Lua. Ada dua jenis operasi file di Lua yaitu deskriptor file implisit dan deskriptor file eksplisit.

Untuk contoh berikut, kami akan menggunakan file contoh test.lua seperti yang ditunjukkan di bawah ini.

-- sample test.lua
-- sample2 test.lua

Operasi buka file sederhana menggunakan pernyataan berikut.

file = io.open (filename [, mode])

Berbagai mode file tercantum dalam tabel berikut.

Sr.No. Mode & Deskripsi
1

"r"

Mode read-only dan merupakan mode default di mana file yang ada dibuka.

2

"w"

Menulis mode aktif yang menimpa file yang ada atau membuat file baru.

3

"a"

Tambahkan mode yang membuka file yang ada atau membuat file baru untuk ditambahkan.

4

"r+"

Mode baca dan tulis untuk file yang sudah ada.

5

"w+"

Semua data yang ada dihapus jika file ada atau file baru dibuat dengan izin baca tulis.

6

"a+"

Tambahkan mode dengan mode baca diaktifkan yang membuka file yang ada atau membuat file baru.

Deskriptor File Implisit

Deskriptor file implisit menggunakan mode input / output standar atau menggunakan file input dan output tunggal. Contoh penggunaan deskriptor file implisit ditunjukkan di bawah ini.

-- Opens a file in read
file = io.open("test.lua", "r")

-- sets the default input file as test.lua
io.input(file)

-- prints the first line of the file
print(io.read())

-- closes the open file
io.close(file)

-- Opens a file in append mode
file = io.open("test.lua", "a")

-- sets the default output file as test.lua
io.output(file)

-- appends a word test to the last line of the file
io.write("-- End of the test.lua file")

-- closes the open file
io.close(file)

Saat Anda menjalankan program, Anda akan mendapatkan output dari baris pertama file test.lua. Untuk program kami, kami mendapatkan output berikut.

-- Sample test.lua

Ini adalah baris pertama pernyataan dalam file test.lua untuk kami. Juga baris "- Akhir dari file test.lua" akan ditambahkan ke baris terakhir dari kode test.lua.

Dalam contoh di atas, Anda dapat melihat bagaimana deskriptor implisit bekerja dengan sistem file menggunakan metode io. "X". Contoh di atas menggunakan io.read () tanpa parameter opsional. Parameter opsional dapat berupa salah satu dari berikut ini.

Sr.No. Mode & Deskripsi
1

"*n"

Membaca dari posisi file saat ini dan mengembalikan angka jika ada di posisi file atau mengembalikan nihil.

2

"*a"

Mengembalikan semua konten file dari posisi file saat ini.

3

"*l"

Membaca baris dari posisi file saat ini, dan memindahkan posisi file ke baris berikutnya.

4

number

Membaca jumlah byte yang ditentukan dalam fungsi.

Metode I / O umum lainnya termasuk,

  • io.tmpfile() - Mengembalikan file sementara untuk membaca dan menulis yang akan dihapus setelah program ditutup.

  • io.type(file) - Mengembalikan apakah file, file tertutup atau nil berdasarkan file input.

  • io.flush() - Menghapus buffer keluaran default.

  • io.lines(optional file name)- Menyediakan iterator loop for generik yang melakukan loop melalui file dan menutup file pada akhirnya, jika nama file diberikan atau file default digunakan dan tidak ditutup pada akhir loop.

Deskriptor File Eksplisit

Kami sering menggunakan deskriptor file eksplisit yang memungkinkan kami memanipulasi banyak file dalam satu waktu. Fungsi ini sangat mirip dengan deskriptor file implisit. Di sini, kami menggunakan file: function_name daripada io.function_name. Contoh berikut dari versi file dari contoh deskriptor file implisit yang sama ditunjukkan di bawah ini.

-- Opens a file in read mode
file = io.open("test.lua", "r")

-- prints the first line of the file
print(file:read())

-- closes the opened file
file:close()

-- Opens a file in append mode
file = io.open("test.lua", "a")

-- appends a word test to the last line of the file
file:write("--test")

-- closes the open file
file:close()

Saat Anda menjalankan program, Anda akan mendapatkan hasil yang sama seperti contoh deskriptor implisit.

-- Sample test.lua

Semua mode file terbuka dan parameter untuk dibaca untuk deskriptor eksternal sama dengan deskriptor file implisit.

Metode file umum lainnya termasuk,

  • file:seek(optional whence, optional offset)- Parameter mana adalah "set", "cur" atau "end". Set penunjuk file baru dengan posisi file yang diperbarui dari awal file. Offsetnya berbasis nol dalam fungsi ini. Offset diukur dari awal file jika argumen pertama adalah "set"; dari posisi saat ini di file jika "cur"; atau dari akhir file jika "akhir". Nilai argumen default adalah "cur" dan 0, sehingga posisi file saat ini dapat diperoleh dengan memanggil fungsi ini tanpa argumen.

  • file:flush() - Menghapus buffer keluaran default.

  • io.lines(optional file name)- Menyediakan iterator loop for generik yang melakukan loop melalui file dan menutup file pada akhirnya, jika nama file diberikan atau file default digunakan dan tidak ditutup pada akhir loop.

Contoh untuk menggunakan metode seek ditampilkan di bawah ini. Ini mengimbangi kursor dari 25 posisi sebelum akhir file. Fungsi baca mencetak sisa file dari posisi pencarian.

-- Opens a file in read
file = io.open("test.lua", "r")

file:seek("end",-25)
print(file:read("*a"))

-- closes the opened file
file:close()

Anda akan mendapatkan beberapa keluaran yang mirip dengan berikut ini.

sample2 test.lua
--test

Anda dapat memainkan semua mode dan parameter yang berbeda untuk mengetahui kemampuan penuh dari operasi file Lua.

Perlunya Penanganan Error

Penanganan kesalahan sangat penting karena operasi dunia nyata sering kali memerlukan penggunaan operasi yang kompleks, yang meliputi operasi file, transaksi database, dan panggilan layanan web.

Dalam pemrograman apa pun, selalu ada persyaratan untuk penanganan kesalahan. Kesalahan dapat terdiri dari dua jenis yang meliputi,

  • Kesalahan sintaks
  • Jalankan kesalahan waktu

Kesalahan Sintaks

Kesalahan sintaks terjadi karena penggunaan berbagai komponen program yang tidak tepat seperti operator dan ekspresi. Contoh sederhana untuk kesalahan sintaks ditunjukkan di bawah ini.

a == 2

Seperti yang Anda ketahui, ada perbedaan antara penggunaan satu "sama dengan" dan ganda "sama dengan". Menggunakan salah satu alih-alih yang lain dapat menyebabkan kesalahan. Satu "sama dengan" mengacu pada tugas sementara dua "sama dengan" mengacu pada perbandingan. Demikian pula, kami memiliki ekspresi dan fungsi yang memiliki cara implementasi yang telah ditentukan sebelumnya.

Contoh lain untuk kesalahan sintaks ditunjukkan di bawah ini -

for a= 1,10
   print(a)
end

Saat kita menjalankan program di atas, kita akan mendapatkan output berikut -

lua: test2.lua:2: 'do' expected near 'print'

Kesalahan sintaks jauh lebih mudah ditangani daripada kesalahan waktu proses karena, juru bahasa Lua menempatkan kesalahan lebih jelas daripada dalam kasus kesalahan runtime. Dari kesalahan di atas, kita dapat mengetahui dengan mudah bahwa menambahkan pernyataan do sebelum pernyataan cetak diperlukan sesuai dengan struktur Lua.

Jalankan Kesalahan Waktu

Jika terjadi error runtime, program berhasil dijalankan, tetapi dapat mengakibatkan error runtime karena kesalahan dalam input atau fungsi yang salah penanganan. Contoh sederhana untuk menunjukkan kesalahan waktu proses ditampilkan di bawah ini.

function add(a,b)
   return a+b
end

add(10)

Ketika kita membangun program, itu akan berhasil dan berjalan. Setelah berjalan, menunjukkan kesalahan waktu proses.

lua: test2.lua:2: attempt to perform arithmetic on local 'b' (a nil value)
stack traceback:
	test2.lua:2: in function 'add'
	test2.lua:5: in main chunk
	[C]: ?

Ini adalah kesalahan waktu proses, yang terjadi karena dua variabel tidak lewat. Itub parameter diharapkan dan di sini nihil dan menghasilkan kesalahan.

Fungsi Tegaskan dan Kesalahan

Untuk menangani kesalahan, kami sering menggunakan dua fungsi - assert dan error. Contoh sederhana ditunjukkan di bawah ini.

local function add(a,b)
   assert(type(a) == "number", "a is not a number")
   assert(type(b) == "number", "b is not a number")
   return a+b
end

add(10)

Saat kita menjalankan program di atas, kita akan mendapatkan output error berikut.

lua: test2.lua:3: b is not a number
stack traceback:
	[C]: in function 'assert'
	test2.lua:3: in function 'add'
	test2.lua:6: in main chunk
	[C]: ?

Itu error (message [, level])mengakhiri fungsi terlindung terakhir yang dipanggil dan mengembalikan pesan sebagai pesan kesalahan. Kesalahan fungsi ini tidak pernah kembali. Biasanya error menambahkan beberapa informasi tentang posisi error di awal pesan. Argumen level menentukan bagaimana mendapatkan posisi kesalahan. Dengan level 1 (default), posisi kesalahan adalah tempat fungsi kesalahan dipanggil. Level 2 menunjukkan kesalahan ke tempat fungsi yang disebut kesalahan dipanggil; dan seterusnya. Meneruskan level 0 menghindari penambahan informasi posisi kesalahan ke pesan.

pcall dan xpcall

Dalam pemrograman Lua, untuk menghindari kesalahan ini dan menangani kesalahan, kita perlu menggunakan fungsi pcall atau xpcall.

Itu pcall (f, arg1, ...)fungsi memanggil fungsi yang diminta dalam mode terlindungi. Jika beberapa kesalahan terjadi dalam fungsi f, itu tidak menimbulkan kesalahan. Itu hanya mengembalikan status kesalahan. Contoh sederhana menggunakan pcall ditunjukkan di bawah ini.

function myfunction ()
   n = n/nil
end

if pcall(myfunction) then
   print("Success")
else
	print("Failure")
end

Saat kita menjalankan program di atas, kita akan mendapatkan output sebagai berikut.

Failure

Itu xpcall (f, err)fungsi memanggil fungsi yang diminta dan juga mengatur penanganan kesalahan. Setiap kesalahan di dalam f tidak disebarkan; sebagai gantinya, xpcall menangkap kesalahan, memanggil fungsi err dengan objek kesalahan asli, dan mengembalikan kode status.

Contoh sederhana untuk xpcall ditunjukkan di bawah ini.

function myfunction ()
   n = n/nil
end

function myerrorhandler( err )
   print( "ERROR:", err )
end

status = xpcall( myfunction, myerrorhandler )
print( status)

Saat kita menjalankan program di atas, kita akan mendapatkan output sebagai berikut.

ERROR:	test2.lua:2: attempt to perform arithmetic on global 'n' (a nil value)
false

Sebagai seorang programmer, sangat penting untuk memastikan bahwa Anda menangani kesalahan penanganan yang tepat dalam program yang Anda tulis. Menggunakan penanganan kesalahan dapat memastikan bahwa kondisi yang tidak diharapkan di luar kondisi batas ditangani tanpa mengganggu pengguna program.

Lua menyediakan pustaka debug, yang menyediakan semua fungsi primitif bagi kita untuk membuat debugger kita sendiri. Meskipun, tidak ada debugger Lua built-in, kami memiliki banyak debugger untuk Lua, yang dibuat oleh berbagai pengembang dengan banyak di antaranya adalah open source.

Fungsi yang tersedia di pustaka debug Lua tercantum dalam tabel berikut bersama dengan penggunaannya.

Sr.No. Metode & Tujuan
1

debug()

Memasuki mode interaktif untuk debugging, yang tetap aktif sampai kita hanya mengetik cont dalam satu baris dan tekan enter. Pengguna dapat memeriksa variabel selama mode ini menggunakan fungsi lain.

2

getfenv(object)

Mengembalikan lingkungan objek.

3

gethook(optional thread)

Mengembalikan pengaturan kait saat ini dari utas, sebagai tiga nilai - fungsi kait saat ini, topeng kait saat ini, dan jumlah kait saat ini.

4

getinfo(optional thread, function or stack level, optional flag)

Mengembalikan tabel dengan info tentang suatu fungsi. Anda dapat memberikan fungsi secara langsung, atau Anda dapat memberikan angka sebagai nilai fungsi, yang berarti fungsi berjalan pada fungsi level dari tumpukan panggilan dari thread yang diberikan - level 0 adalah fungsi saat ini (getinfo itu sendiri); level 1 adalah fungsi yang disebut getinfo; dan seterusnya. Jika fungsi adalah angka yang lebih besar dari jumlah fungsi aktif, maka getinfo mengembalikan nol.

5

getlocal(optional thread, stack level, local index)

Mengembalikan nama dan nilai variabel lokal dengan indeks fungsi lokal pada tingkat tumpukan. Mengembalikan nil jika tidak ada variabel lokal dengan indeks yang diberikan, dan menimbulkan kesalahan saat dipanggil dengan tingkat di luar rentang.

6

getmetatable(value)

Mengembalikan metatabel dari objek tertentu atau nihil jika tidak memiliki metatabel.

7

getregistry()

Mengembalikan tabel registri, tabel yang telah ditentukan sebelumnya yang dapat digunakan oleh kode C apa pun untuk menyimpan nilai Lua apa pun yang perlu disimpan.

8

getupvalue(function, upvalue index)

Fungsi ini mengembalikan nama dan nilai upvalue dengan indeks naik dari function func. Fungsi mengembalikan nol jika tidak ada nilai naik dengan indeks yang diberikan.

9

setfenv(function or thread or userdata, environment table)

Mengatur lingkungan dari objek yang diberikan ke tabel yang diberikan. Mengembalikan objek.

10

sethook(optional thread, hook function, hook mask string with "c" and/or "r" and/or "l", optional instruction count)

Menetapkan fungsi yang diberikan sebagai pengait. Topeng string dan jumlah nomor menjelaskan kapan hook akan dipanggil. Di sini, c, r dan l dipanggil setiap kali Lua memanggil, kembali, dan memasukkan setiap baris kode dalam sebuah fungsi.

11

setlocal(optional thread, stack level, local index, value)

Menetapkan nilai ke variabel lokal dengan indeks lokal fungsi pada tingkat tumpukan. Fungsi mengembalikan nihil jika tidak ada variabel lokal dengan indeks yang diberikan, dan menimbulkan kesalahan saat dipanggil dengan level di luar rentang. Jika tidak, itu mengembalikan nama variabel lokal.

12

setmetatable(value, metatable)

Menetapkan metatabel untuk objek yang diberikan ke tabel yang diberikan (yang bisa nihil).

13

setupvalue(function, upvalue index, value)

Fungsi ini menetapkan nilai ke nilai atas dengan indeks naik dari fungsi fungsi. Fungsi mengembalikan nol jika tidak ada nilai naik dengan indeks yang diberikan. Jika tidak, itu mengembalikan nama upvalue.

14

traceback(optional thread, optional message string, optional level argument)

Membuat pesan kesalahan yang diperpanjang dengan traceback.

Daftar di atas adalah daftar lengkap dari fungsi debug di Lua dan kami sering menggunakan pustaka yang menggunakan fungsi di atas dan menyediakan debugging yang lebih mudah. Menggunakan fungsi ini dan membuat debugger kita sendiri cukup rumit dan tidak disukai. Bagaimanapun, kita akan melihat contoh penggunaan sederhana fungsi debugging.

function myfunction ()
   print(debug.traceback("Stack trace"))
   print(debug.getinfo(1))
   print("Stack trace end")

   return 10
end

myfunction ()
print(debug.getinfo(1))

Saat kita menjalankan program di atas, kita akan mendapatkan stack trace seperti gambar di bawah ini.

Stack trace
stack traceback:
	test2.lua:2: in function 'myfunction'
	test2.lua:8: in main chunk
	[C]: ?
table: 0054C6C8
Stack trace end

Dalam program contoh di atas, pelacakan tumpukan dicetak dengan menggunakan fungsi debug.trace yang tersedia di perpustakaan debug. Debug.getinfo mendapatkan tabel fungsi saat ini.

Debugging - Contoh

Kita sering kali perlu mengetahui variabel lokal dari suatu fungsi untuk debugging. Untuk tujuan itu, kita dapat menggunakan getupvalue dan untuk mengatur variabel lokal ini, kita menggunakan setupvalue. Contoh sederhana untuk ini ditunjukkan di bawah.

function newCounter ()
   local n = 0
   local k = 0
	
   return function ()
      k = n
      n = n + 1
      return n
   end
	
end

counter = newCounter ()

print(counter())
print(counter())

local i = 1

repeat
   name, val = debug.getupvalue(counter, i)
	
   if name then
      print ("index", i, name, "=", val)
		
      if(name == "n") then
         debug.setupvalue (counter,2,10)
      end
		
      i = i + 1
   end -- if
	
until not name

print(counter())

Saat kita menjalankan program di atas, kita akan mendapatkan output sebagai berikut.

1
2
index	1	k	=	1
index	2	n	=	2
11

Dalam contoh ini, penghitung diperbarui satu kali setiap kali dipanggil. Kita dapat melihat status variabel lokal saat ini menggunakan fungsi getupvalue. Kami kemudian menetapkan variabel lokal ke nilai baru. Di sini, n adalah 2 sebelum operasi himpunan dipanggil. Menggunakan fungsi setupvalue, itu diperbarui menjadi 10. Sekarang ketika kita memanggil fungsi penghitung, itu akan mengembalikan 11, bukan 3.

Jenis Debugging

  • Debugging baris perintah
  • Debugging grafis

Debugging Baris Perintah

Debugging baris perintah adalah jenis debugging yang menggunakan baris perintah untuk debug dengan bantuan perintah dan pernyataan cetak. Ada banyak debugger baris perintah yang tersedia untuk Lua yang beberapa di antaranya tercantum di bawah ini.

  • RemDebug- RemDebug adalah debugger jarak jauh untuk Lua 5.0 dan 5.1. Ini memungkinkan Anda mengontrol eksekusi program Lua lain dari jarak jauh, mengatur breakpoint dan memeriksa status program saat ini. RemDebug juga dapat men-debug skrip CGILua.

  • clidebugger- Debugger antarmuka baris perintah sederhana untuk Lua 5.1 yang ditulis dalam Lua murni. Ini tidak tergantung pada apa pun selain pustaka standar Lua 5.1. Itu terinspirasi oleh RemDebug tetapi tidak memiliki fasilitas jarak jauhnya.

  • ctrace - Alat untuk melacak panggilan API Lua.

  • xdbLua - Debugger baris perintah Lua sederhana untuk platform Windows.

  • LuaInterface - Debugger- Proyek ini adalah ekstensi debugger untuk LuaInterface. Ini meningkatkan antarmuka debug Lua bawaan ke tingkat yang lebih tinggi. Interaksi dengan debugger dilakukan oleh kejadian dan pemanggilan metode.

  • Rldb- Ini adalah debugger Lua jarak jauh melalui soket, tersedia di Windows dan Linux. Ini dapat memberi Anda lebih banyak fitur daripada yang sudah ada.

  • ModDebug - Hal ini memungkinkan dalam mengontrol eksekusi program Lua lain dari jarak jauh, mengatur breakpoint, dan memeriksa status program saat ini.

Debugging Grafis

Debugging grafis tersedia dengan bantuan IDE di mana Anda diberikan debugging visual dari berbagai status seperti nilai variabel, pelacakan tumpukan dan informasi terkait lainnya. Ada representasi visual dan kontrol eksekusi langkah demi langkah dengan bantuan breakpoints, step into, step over, dan tombol lain di IDE.

Ada beberapa grafis debugger untuk Lua dan itu termasuk yang berikut ini.

  • SciTE - IDE windows default untuk Lua menyediakan beberapa fasilitas debugging seperti breakpoints, step, step in, step over, variabel watch dan sebagainya.

  • Decoda - Ini adalah debugger grafis dengan dukungan debugging jarak jauh.

  • ZeroBrane Studio- Lua IDE dengan remote debugger terintegrasi, tampilan tumpukan, tampilan jam, konsol jarak jauh, penganalisis statis, dan banyak lagi. Bekerja dengan LuaJIT, Love2d, Moai, dan mesin Lua lainnya; Windows, OSX, dan Linux. Sumber terbuka.

  • akdebugger - Plugin Debugger dan editor Lua untuk Eclipse.

  • luaedit - Ini menampilkan debugging jarak jauh, debugging lokal, penyorotan sintaks, daftar proposal penyelesaian, mesin proposisi parameter, manajemen breakpoint lanjutan (termasuk sistem kondisi pada breakpoint dan jumlah klik), daftar fungsi, daftar variabel global dan lokal, jam tangan, manajemen berorientasi solusi.

Lua menggunakan manajemen memori otomatis yang menggunakan pengumpulan sampah berdasarkan algoritma tertentu yang ada di dalam Lua. Sebagai hasil dari manajemen memori otomatis, sebagai pengembang -

  • Tidak perlu khawatir tentang mengalokasikan memori untuk objek.
  • Tidak perlu membebaskannya saat tidak lagi diperlukan kecuali untuk menyetelnya ke nihil.

Lua menggunakan pengumpul sampah yang berjalan dari waktu ke waktu untuk mengumpulkan objek mati saat tidak lagi dapat diakses dari program Lua.

Semua objek termasuk tabel, data pengguna, fungsi, utas, string, dan sebagainya tunduk pada manajemen memori otomatis. Lua menggunakan tanda inkremental dan pengumpul sapuan yang menggunakan dua angka untuk mengontrol siklus pengumpulan sampahnya yaitugarbage collector pause dan garbage collector step multiplier. Nilai-nilai ini dalam persentase dan nilai 100 seringkali sama dengan 1 secara internal.

Jeda Pengumpul Sampah

Jeda pemulung digunakan untuk mengontrol berapa lama pemulung harus menunggu sebelumnya; itu dipanggil lagi oleh manajemen memori otomatis Lua. Nilai kurang dari 100 berarti Lua tidak akan menunggu siklus berikutnya. Demikian pula, nilai yang lebih tinggi dari nilai ini akan mengakibatkan pengumpul sampah menjadi lambat dan kurang agresif. Nilai 200, berarti kolektor menunggu total memori yang digunakan menjadi dua kali lipat sebelum memulai siklus baru. Karenanya, bergantung pada sifat dan kecepatan aplikasi, mungkin ada kebutuhan untuk mengubah nilai ini untuk mendapatkan kinerja terbaik dalam aplikasi Lua.

Pengganda Langkah Pengumpul Sampah

Pengali langkah ini mengontrol kecepatan relatif pengumpul sampah dengan alokasi memori dalam program Lua. Nilai langkah yang lebih besar akan membuat pengumpul sampah menjadi lebih agresif dan juga meningkatkan ukuran langkah dari setiap langkah inkremental pengumpulan sampah. Nilai yang kurang dari 100 sering kali dapat menyebabkan pengumpul sampah tidak menyelesaikan siklusnya dan umumnya tidak disukai. Nilai defaultnya adalah 200, yang berarti pengumpul sampah berjalan dua kali kecepatan alokasi memori.

Fungsi Pengumpul Sampah

Sebagai pengembang, kami memiliki kendali atas manajemen memori otomatis di Lua. Untuk ini, kami memiliki metode berikut.

  • collectgarbage("collect") - Menjalankan satu siklus lengkap pengumpulan sampah.

  • collectgarbage("count") - Mengembalikan jumlah memori yang saat ini digunakan oleh program di Kilobyte.

  • collectgarbage("restart") - Jika pengumpul sampah telah dihentikan, ia akan memulai kembali.

  • collectgarbage("setpause")- Menetapkan nilai yang diberikan sebagai parameter kedua dibagi 100 ke variabel jeda pengumpul sampah. Penggunaannya seperti dibahas sedikit di atas.

  • collectgarbage("setstepmul")- Menetapkan nilai yang diberikan sebagai parameter kedua dibagi 100 ke variabel pengali langkah sampah. Penggunaannya seperti dibahas sedikit di atas.

  • collectgarbage("step")- Menjalankan satu langkah pengumpulan sampah. Semakin besar argumen kedua, semakin besar langkah ini. Pengumpulan sampah akan menampilkan nilai true jika langkah yang dipicu adalah langkah terakhir dari siklus pengumpulan sampah.

  • collectgarbage("stop") - Menghentikan pengumpul sampah jika sedang berjalan.

Contoh sederhana menggunakan contoh pengumpul sampah ditunjukkan di bawah ini.

mytable = {"apple", "orange", "banana"}

print(collectgarbage("count"))

mytable = nil

print(collectgarbage("count"))

print(collectgarbage("collect"))

print(collectgarbage("count"))

Saat kita menjalankan program di atas, kita akan mendapatkan output sebagai berikut. Harap dicatat bahwa hasil ini akan bervariasi karena perbedaan jenis sistem operasi dan juga fitur manajemen memori otomatis Lua.

23.1455078125   149
23.2880859375   295
0
22.37109375     380

Anda dapat melihat pada program di atas, setelah pengumpulan sampah selesai, itu mengurangi memori yang digunakan. Tapi, tidak wajib menyebut ini. Bahkan jika kita tidak memanggilnya, itu akan dijalankan secara otomatis pada tahap selanjutnya oleh juru bahasa Lua setelah periode yang telah ditentukan.

Jelas, kita dapat mengubah perilaku pengumpul sampah menggunakan fungsi-fungsi ini jika diperlukan. Fungsi ini memberikan sedikit kemampuan tambahan bagi pengembang untuk menangani situasi yang kompleks. Tergantung pada jenis memori yang dibutuhkan untuk program tersebut, Anda mungkin atau mungkin tidak menggunakan fitur ini. Tetapi sangat berguna untuk mengetahui penggunaan memori dalam aplikasi dan memeriksanya selama pemrograman itu sendiri untuk menghindari hasil yang tidak diinginkan setelah penerapan.

Pengantar OOP

Pemrograman Berorientasi Objek (Object Oriented Programming / OOP), adalah salah satu teknik pemrograman yang paling banyak digunakan yang digunakan di era modern pemrograman. Ada sejumlah bahasa pemrograman yang mendukung OOP yang meliputi,

  • C++
  • Java
  • Objective-C
  • Smalltalk
  • C#
  • Ruby

Fitur OOP

  • Class - Kelas adalah templat yang dapat diperluas untuk membuat objek, memberikan nilai awal untuk status (variabel anggota) dan implementasi perilaku.

  • Objects - Ini adalah turunan dari kelas dan memiliki memori terpisah yang dialokasikan untuk dirinya sendiri.

  • Inheritance - Ini adalah konsep dimana variabel dan fungsi dari satu kelas diwarisi oleh kelas lain.

  • Encapsulation- Ini adalah proses menggabungkan data dan fungsi di dalam kelas. Data dapat diakses di luar kelas dengan bantuan fungsi. Ini juga dikenal sebagai abstraksi data.

OOP di Lua

Anda dapat mengimplementasikan orientasi objek di Lua dengan bantuan tabel dan fungsi kelas pertama Lua. Dengan menempatkan fungsi dan data terkait ke dalam tabel, sebuah objek terbentuk. Pewarisan dapat diimplementasikan dengan bantuan metatabel, menyediakan mekanisme pencarian untuk fungsi (metode) dan bidang yang tidak ada di objek induk.

Tabel di Lua memiliki fitur objek seperti negara dan identitas yang tidak bergantung pada nilai-nilainya. Dua objek (tabel) dengan nilai yang sama adalah objek yang berbeda, sedangkan sebuah objek dapat memiliki nilai yang berbeda pada waktu yang berbeda, tetapi objek tersebut selalu sama. Seperti objek, tabel memiliki siklus hidup yang tidak bergantung pada siapa yang membuatnya atau di mana mereka dibuat.

Contoh Dunia Nyata

Konsep orientasi objek banyak digunakan tetapi Anda perlu memahaminya dengan jelas untuk mendapatkan keuntungan yang tepat dan maksimal.

Mari kita perhatikan contoh matematika sederhana. Kami sering menghadapi situasi di mana kami mengerjakan berbagai bentuk seperti lingkaran, persegi panjang, dan persegi.

Bentuknya bisa memiliki properti umum Area. Jadi, kita bisa memperluas bentuk lain dari bentuk objek dasar dengan luas properti umum. Masing-masing bentuk dapat memiliki sifat dan fungsinya sendiri seperti persegi panjang dapat memiliki properti panjang, lebar, luas sebagai propertinya, dan printArea serta hitunganArea sebagai fungsinya.

Membuat Kelas Sederhana

Implementasi kelas sederhana untuk persegi panjang dengan tiga area properti, panjang, dan lebar ditampilkan di bawah ini. Ini juga memiliki fungsi printArea untuk mencetak area yang dihitung.

-- Meta class
Rectangle = {area = 0, length = 0, breadth = 0}

-- Derived class method new

function Rectangle:new (o,length,breadth)
   o = o or {}
   setmetatable(o, self)
   self.__index = self
   self.length = length or 0
   self.breadth = breadth or 0
   self.area = length*breadth;
   return o
end

-- Derived class method printArea

function Rectangle:printArea ()
   print("The area of Rectangle is ",self.area)
end

Membuat Objek

Membuat objek adalah proses mengalokasikan memori untuk instance kelas. Setiap objek memiliki memorinya sendiri dan berbagi data kelas yang sama.

r = Rectangle:new(nil,10,20)

Mengakses Properti

Kami dapat mengakses properti di kelas menggunakan operator titik seperti yang ditunjukkan di bawah ini -

print(r.length)

Mengakses Fungsi Anggota

Anda dapat mengakses fungsi anggota menggunakan operator titik dua dengan objek seperti yang ditunjukkan di bawah ini -

r:printArea()

Memori dialokasikan dan nilai awal ditetapkan. Proses inisialisasi dapat dibandingkan dengan konstruktor dalam bahasa berorientasi objek lainnya. Ini tidak lain adalah fungsi yang memungkinkan nilai pengaturan seperti yang ditunjukkan di atas.

Contoh Lengkap

Mari kita lihat contoh lengkap menggunakan orientasi objek di Lua.

-- Meta class
Shape = {area = 0}

-- Base class method new

function Shape:new (o,side)
   o = o or {}
   setmetatable(o, self)
   self.__index = self
   side = side or 0
   self.area = side*side;
   return o
end

-- Base class method printArea

function Shape:printArea ()
   print("The area is ",self.area)
end

-- Creating an object
myshape = Shape:new(nil,10)

myshape:printArea()

Saat Anda menjalankan program di atas, Anda akan mendapatkan output berikut.

The area is 	100

Warisan di Lua

Pewarisan adalah proses memperluas objek dasar sederhana seperti bentuk menjadi persegi panjang, persegi, dan sebagainya. Ini sering digunakan di dunia nyata untuk berbagi dan memperluas properti dan fungsi dasar.

Mari kita lihat ekstensi kelas sederhana. Kami memiliki kelas seperti yang ditunjukkan di bawah ini.

-- Meta class
Shape = {area = 0}

-- Base class method new

function Shape:new (o,side)
   o = o or {}
   setmetatable(o, self)
   self.__index = self
   side = side or 0
   self.area = side*side;
   return o
end

-- Base class method printArea

function Shape:printArea ()
   print("The area is ",self.area)
end

Kita dapat memperluas bentuk menjadi kelas persegi seperti yang ditunjukkan di bawah ini.

Square = Shape:new()

-- Derived class method new

function Square:new (o,side)
   o = o or Shape:new(o,side)
   setmetatable(o, self)
   self.__index = self
   return o
end

Fungsi Dasar Over-riding

Kita dapat mengganti fungsi kelas dasar daripada menggunakan fungsi di kelas dasar, kelas turunan dapat memiliki implementasinya sendiri seperti yang ditunjukkan di bawah ini -

-- Derived class method printArea

function Square:printArea ()
   print("The area of square is ",self.area)
end

Contoh Lengkap Warisan

Kita dapat memperluas implementasi kelas sederhana di Lua seperti yang ditunjukkan di atas dengan bantuan metode baru lainnya dengan bantuan metatable. Semua variabel anggota dan fungsi kelas dasar dipertahankan di kelas turunan.

-- Meta class
Shape = {area = 0}

-- Base class method new

function Shape:new (o,side)
   o = o or {}
   setmetatable(o, self)
   self.__index = self
   side = side or 0
   self.area = side*side;
   return o
end

-- Base class method printArea

function Shape:printArea ()
   print("The area is ",self.area)
end

-- Creating an object
myshape = Shape:new(nil,10)
myshape:printArea()

Square = Shape:new()

-- Derived class method new

function Square:new (o,side)
   o = o or Shape:new(o,side)
   setmetatable(o, self)
   self.__index = self
   return o
end

-- Derived class method printArea

function Square:printArea ()
   print("The area of square is ",self.area)
end

-- Creating an object
mysquare = Square:new(nil,10)
mysquare:printArea()

Rectangle = Shape:new()

-- Derived class method new

function Rectangle:new (o,length,breadth)
   o = o or Shape:new(o)
   setmetatable(o, self)
   self.__index = self
   self.area = length * breadth
   return o
end

-- Derived class method printArea

function Rectangle:printArea ()
    print("The area of Rectangle is ",self.area)
end

-- Creating an object

myrectangle = Rectangle:new(nil,10,20)
myrectangle:printArea()

Saat kita menjalankan program di atas, kita akan mendapatkan output berikut -

The area is 	100
The area of square is 	100
The area of Rectangle is 	200

Dalam contoh di atas, kami telah membuat dua kelas turunan - Persegi Panjang dan Persegi dari kelas dasar Persegi. Dimungkinkan untuk mengganti fungsi dari kelas dasar di kelas turunan. Dalam contoh ini, kelas turunan menggantikan fungsi printArea.

Lua adalah bahasa yang sangat fleksibel dan sering digunakan di berbagai platform termasuk aplikasi web. Komunitas Kepler yang dibentuk pada tahun 2004 menyediakan komponen web open source di Lua.

Meskipun, ada kerangka web lain yang menggunakan Lua yang telah dikembangkan, kami akan berfokus terutama pada komponen yang disediakan oleh komunitas Kepler.

Aplikasi dan Kerangka

  • Orbit adalah kerangka kerja web MVC untuk Lua, berdasarkan WSAPI.

  • WSAPI adalah API yang mengabstraksi server host web dari aplikasi web Lua dan merupakan basis untuk banyak proyek.

  • Xavante adalah server Web Lua yang menawarkan antarmuka WSAPI.

  • Sputnik adalah wiki / CMS yang dikembangkan melalui WSAPI di Proyek Kepler yang digunakan untuk humor dan hiburan.

  • CGILuamenawarkan pembuatan halaman web LuaPages dan LuaScripts, berdasarkan WSAPI tetapi tidak lagi didukung. Gunakan Orbit, Sputnik atau WSAPI sebagai gantinya.

Dalam tutorial ini, kami akan mencoba membuat Anda memahami apa yang dapat dilakukan Lua dan untuk mengetahui lebih banyak tentang instalasi dan penggunaannya, lihat kepler situs web

Orbit

Orbit adalah kerangka kerja web MVC untuk Lua. Ini sepenuhnya meninggalkan model CGILua dari "skrip" demi aplikasi, di mana setiap aplikasi Orbit dapat muat dalam satu file, tetapi Anda dapat membaginya menjadi beberapa file jika Anda mau.

Semua aplikasi Orbit mengikuti protokol WSAPI, jadi saat ini mereka bekerja dengan Xavante, CGI dan Fastcgi. Ini mencakup peluncur yang memudahkan peluncuran instance Xavante untuk pengembangan.

Cara termudah untuk menginstal Orbit menggunakan LuaRocks. Luarocks install orbit adalah perintah untuk menginstal. Untuk ini, Anda perlu menginstal LuaRocks terlebih dahulu.

Jika Anda belum menginstal semua dependensi, berikut adalah langkah-langkah yang harus diikuti untuk mengatur Orbit di lingkungan Unix / Linux.

Menginstal Apache

Hubungkan ke server Anda. Instal Apache2, modul pendukungnya dan aktifkan modul Apache2 yang diperlukan menggunakan -

$ sudo apt-get install apache2 libapache2-mod-fcgid libfcgi-dev build-essential $ sudo a2enmod rewrite
$ sudo a2enmod fcgid $ sudo /etc/init.d/apache2 force-reload

Pasang LuaRocks

$ sudo apt-get install luarocks

Instal WSAPI, FCGI, Orbit, dan Xavante

$ sudo luarocks install orbit
$ sudo luarocks install wsapi-xavante $ sudo luarocks install wsapi-fcgi

Menyiapkan Apache2

$ sudo raj /etc/apache2/sites-available/default

Tambahkan bagian berikut ini di bawah bagian <Directory / var / www /> dari file konfigurasi. Jika bagian ini memiliki 'AllowOverride None' maka Anda perlu mengubah 'None' menjadi 'All' sehingga file .htaccess dapat menimpa konfigurasi secara lokal.

<IfModule mod_fcgid.c>

   AddHandler fcgid-script .lua
   AddHandler fcgid-script .ws
   AddHandler fcgid-script .op
	
   FCGIWrapper "/usr/local/bin/wsapi.fcgi" .ws
   FCGIWrapper "/usr/local/bin/wsapi.fcgi" .lua
   FCGIWrapper "/usr/local/bin/op.fcgi" .op
	
   #FCGIServer "/usr/local/bin/wsapi.fcgi" -idle-timeout 60 -processes 1
   #IdleTimeout 60
   #ProcessLifeTime 60
	
</IfModule>

Mulai ulang server untuk memastikan perubahan yang dibuat mulai berlaku.

Untuk mengaktifkan aplikasi Anda, Anda perlu menambahkan + ExecCGI ke file .htaccess di root aplikasi Orbit Anda - dalam hal ini, / var / www.

Options +ExecCGI
DirectoryIndex index.ws

Contoh Sederhana - Orbit

#!/usr/bin/env index.lua

-- index.lua
require"orbit"

-- declaration
module("myorbit", package.seeall, orbit.new)

-- handler

function index(web)
   return my_home_page()
end

-- dispatch
myorbit:dispatch_get(index, "/", "/index")

-- Sample page

function my_home_page()

   return [[
      <head></head>
      <html>
         <h2>First Page</h2>
      </html>
   ]]
	
end

Sekarang, Anda harus dapat meluncurkan browser web Anda. Buka http: // localhost: 8080 / dan Anda akan melihat output berikut -

First Page

Orbit menyediakan opsi lain, yaitu kode Lua dapat menghasilkan html.

#!/usr/bin/env index.lua

-- index.lua
require"orbit"

function generate()
   return html {
      head{title "HTML Example"},
		
      body{
         h2{"Here we go again!"}
      }
   }
end

orbit.htmlify(generate)

print(generate())

Membuat Formulir

Contoh formulir sederhana ditunjukkan di bawah ini -

#!/usr/bin/env index.lua
require"orbit"

function wrap (inner)
   return html{ head(), body(inner) }
end

function test ()
   return wrap(form (H'table' {
      tr{td"First name",td( input{type = 'text', name='first'})},
      tr{td"Second name",td(input{type = 'text', name='second'})},
      tr{ td(input{type = 'submit', value = 'Submit!'}),
         td(input{type = 'submit',value = 'Cancel'})
      },
   }))
end

orbit.htmlify(wrap,test)

print(test())

WSAPI

Seperti yang disebutkan sebelumnya, WSAPI bertindak sebagai basis untuk banyak proyek dan memiliki banyak fitur yang disematkan di dalamnya. Anda dapat menggunakan WSAPI dan mendukung platform berikut,

  • Windows
  • Sistem berbasis UNIX

Server dan antarmuka yang didukung oleh WSAPI termasuk,

  • CGI
  • FastCGI
  • Xavante

WSAPI menyediakan sejumlah pustaka, yang memudahkan kita dalam pemrograman web menggunakan Lua. Beberapa fitur yang didukung di Lua termasuk,

  • Minta pemrosesan
  • Buffering keluaran
  • Authentication
  • Unggahan file
  • Minta isolasi
  • Multiplexing

Contoh sederhana WSAPI ditunjukkan di bawah ini -

#!/usr/bin/env wsapi.cgi

module(..., package.seeall)
function run(wsapi_env)
   local headers = { ["Content-type"] = "text/html" }
   
   local function hello_text()
      coroutine.yield("<html><body>")
      coroutine.yield("<p&gtHello Wsapi!</p>")
      coroutine.yield("<p&gtPATH_INFO: " .. wsapi_env.PATH_INFO .. "</p>")
      coroutine.yield("<p&gtSCRIPT_NAME: " .. wsapi_env.SCRIPT_NAME .. "</p>")
      coroutine.yield("</body></html>")
   end

   return 200, headers, coroutine.wrap(hello_text)
end

Anda dapat melihat pada kode di atas halaman html sederhana dibentuk dan dikembalikan. Anda dapat melihat penggunaan coroutine yang memungkinkan untuk mengembalikan pernyataan demi pernyataan ke fungsi pemanggil. Terakhir, kode status html (200), header dan halaman html dikembalikan.

Xavante

Xavante adalah server Web Lua HTTP 1.1 yang menggunakan arsitektur modular berdasarkan penangan yang dipetakan URI. Xavante saat ini menawarkan,

  • Penangan file
  • Alihkan penangan
  • Penangan WSAPI

File handler digunakan untuk file umum. Redirect handler memungkinkan pemetaan ulang URI dan penangan WSAPI untuk menangani aplikasi WSAPI.

Contoh sederhana ditunjukkan di bawah ini.

require "xavante.filehandler"
require "xavante.cgiluahandler"
require "xavante.redirecthandler"

-- Define here where Xavante HTTP documents scripts are located
local webDir = XAVANTE_WEB

local simplerules = {

   { -- URI remapping example
      match = "^[^%./]*/$",
      with = xavante.redirecthandler,
      params = {"index.lp"}
   }, 

   { -- cgiluahandler example
      match = {"%.lp$", "%.lp/.*$", "%.lua$", "%.lua/.*$" },
      with = xavante.cgiluahandler.makeHandler (webDir)
   },
    
   { -- filehandler example
      match = ".",
      with = xavante.filehandler,
      params = {baseDir = webDir}
   },
} 

xavante.HTTP{
   server = {host = "*", port = 8080},
    
   defaultHost = {
      rules = simplerules
   },
}

Untuk menggunakan host virtual dengan Xavante, panggilan ke xavante.HTTP akan diubah menjadi seperti berikut -

xavante.HTTP{
   server = {host = "*", port = 8080},
    
   defaultHost = {},
    
   virtualhosts = {
      ["www.sitename.com"] = simplerules
   }
}

Komponen Web Lua

  • Copas, dispatcher berdasarkan coroutine yang dapat digunakan oleh server TCP / IP.

  • Cosmo, mesin "template aman" yang melindungi aplikasi Anda dari kode arbitrer di template.

  • Coxpcall merangkum pcall dan xpcall asli Lua dengan yang kompatibel dengan coroutine.

  • LuaFileSystem, cara portabel untuk mengakses struktur direktori dan atribut file yang mendasarinya.

  • Rings, sebuah pustaka yang menyediakan cara untuk membuat status Lua baru dari dalam Lua.

Catatan Akhir

Ada begitu banyak kerangka kerja dan komponen web berbasis Lua yang tersedia untuk kita dan berdasarkan kebutuhan, itu dapat dipilih. Ada kerangka web lain yang tersedia yang meliputi berikut ini -

  • Moonstalkmemungkinkan pengembangan yang efisien dan hosting proyek berbasis web yang dibuat secara dinamis yang dibangun dengan bahasa Lua; dari halaman dasar hingga aplikasi kompleks.

  • Lapis, kerangka kerja untuk membangun aplikasi web menggunakan MoonScript (atau Lua) yang berjalan di dalam versi Nginx yang disesuaikan yang disebut OpenResty.

  • Lua Server Pages, plugin mesin skrip Lua yang menghilangkan pendekatan lain apa pun untuk pengembangan web tertanam, menawarkan jalan pintas yang dramatis ke halaman server C tradisional.

Kerangka kerja web ini dapat memanfaatkan aplikasi web Anda dan membantu Anda melakukan operasi yang hebat.

Untuk operasi data sederhana, kami dapat menggunakan file, tetapi, terkadang, operasi file ini mungkin tidak efisien, dapat diskalakan, dan bertenaga. Untuk tujuan ini, kita mungkin sering beralih menggunakan database. LuaSQL adalah antarmuka sederhana dari Lua ke sejumlah sistem manajemen basis data. LuaSQL adalah pustaka, yang menyediakan dukungan untuk berbagai jenis SQL. Ini termasuk,

  • SQLite
  • Mysql
  • ODBC

Dalam tutorial ini, kita akan membahas penanganan database MySQL dan SQLite di Lua. Ini menggunakan antarmuka generik untuk keduanya dan harus memungkinkan untuk port implementasi ini ke jenis database lain juga. Pertama mari kita lihat bagaimana Anda dapat melakukan operasi di MySQL.

Pengaturan db MySQL

Untuk menggunakan contoh berikut agar berfungsi seperti yang diharapkan, kita memerlukan penyiapan db awal. Asumsinya tercantum di bawah ini.

  • Anda telah menginstal dan mengatur MySQL dengan pengguna default sebagai root dan kata sandi sebagai '123456'.

  • Anda telah membuat tes database.

  • Anda telah melalui tutorial MySQL untuk memahami Dasar-Dasar MySQL.

Mengimpor MySQL

Kita bisa menggunakan yang sederhana require pernyataan untuk mengimpor pustaka sqlite dengan asumsi bahwa implementasi Lua Anda dilakukan dengan benar.

mysql = require "luasql.mysql"

Variabel mysql akan memberikan akses ke fungsi dengan merujuk ke tabel mysql utama.

Menyiapkan Koneksi

Kita dapat mengatur koneksi dengan memulai lingkungan MySQL dan kemudian membuat koneksi untuk lingkungan tersebut. Itu ditunjukkan di bawah ini.

local env  = mysql.mysql()
local conn = env:connect('test','root','123456')

Koneksi di atas akan terhubung ke file MySQL yang ada dan membuat koneksi dengan file yang baru dibuat.

Jalankan Fungsi

Ada fungsi eksekusi sederhana yang tersedia dengan koneksi yang akan membantu kita melakukan semua operasi db mulai dari membuat, menyisipkan, menghapus, memperbarui, dan sebagainya. Sintaksnya ditunjukkan di bawah ini -

conn:execute([[ 'MySQLSTATEMENT' ]])

Dalam sintaks di atas, kita perlu memastikan bahwa koneksi terbuka dan koneksi MySQL yang ada dan mengganti 'MySQLSTATEMENT' dengan pernyataan yang benar.

Buat Contoh Tabel

Contoh buat tabel sederhana ditunjukkan di bawah ini. Ini membuat tabel dengan dua id parameter tipe integer dan nama tipe varchar.

mysql = require "luasql.mysql"

local env  = mysql.mysql()
local conn = env:connect('test','root','123456')

print(env,conn)

status,errorString = conn:execute([[CREATE TABLE sample2 (id INTEGER, name TEXT);]])
print(status,errorString )

Ketika Anda menjalankan program di atas, akan dibuat tabel bernama sample dengan dua kolom yaitu, id dan name.

MySQL environment (004BB178)	MySQL connection (004BE3C8)
0	nil

Jika ada kesalahan, Anda akan dikembalikan ke pernyataan kesalahan, bukan nil. Pernyataan kesalahan sederhana ditunjukkan di bawah ini.

LuaSQL: Error executing query. MySQL: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '"id INTEGER, name TEXT)' at line 1

Sisipkan Contoh Pernyataan

Pernyataan insert untuk MySQL ditunjukkan di bawah ini.

conn:execute([[INSERT INTO sample values('11','Raj')]])

Perbarui Contoh Pernyataan

Pernyataan pembaruan untuk MySQL ditunjukkan di bawah ini.

conn:execute([[UPDATE sample3 SET name='John' where id ='12']])

Hapus Contoh Pernyataan

Pernyataan delete untuk MySQL ditunjukkan di bawah ini.

conn:execute([[DELETE from sample3 where id ='12']])

Pilih Contoh Pernyataan

Sejauh menyangkut pernyataan pilih, kita perlu melakukan perulangan melalui setiap baris dan mengekstrak data yang diperlukan. Pernyataan pemilihan sederhana ditunjukkan di bawah ini.

cursor,errorString = conn:execute([[select * from sample]])
row = cursor:fetch ({}, "a")

while row do
   print(string.format("Id: %s, Name: %s", row.id, row.name))
   -- reusing the table of results
   row = cursor:fetch (row, "a")
end

Pada kode di atas, conn adalah koneksi MySQL terbuka. Dengan bantuan kursor yang dikembalikan oleh pernyataan eksekusi, Anda dapat mengulang melalui respons tabel dan mengambil data pilihan yang diperlukan.

Contoh Lengkap

Contoh lengkap termasuk semua pernyataan di atas diberikan di bawah ini.

mysql = require "luasql.mysql"

local env  = mysql.mysql()
local conn = env:connect('test','root','123456')
print(env,conn)

status,errorString = conn:execute([[CREATE TABLE sample3 (id INTEGER, name TEXT)]])
print(status,errorString )

status,errorString = conn:execute([[INSERT INTO sample3 values('12','Raj')]])
print(status,errorString )

cursor,errorString = conn:execute([[select * from sample3]])
print(cursor,errorString)

row = cursor:fetch ({}, "a")

while row do
   print(string.format("Id: %s, Name: %s", row.id, row.name))
   row = cursor:fetch (row, "a")
end

-- close everything
cursor:close()
conn:close()
env:close()

Saat Anda menjalankan program di atas, Anda akan mendapatkan output berikut.

MySQL environment (0037B178)	MySQL connection (0037EBA8)
0	nil
1	nil
MySQL cursor (003778A8)	nil
Id: 12, Name: Raj

Melakukan Transaksi

Transaksi adalah mekanisme yang memastikan konsistensi data. Transaksi harus memiliki empat properti berikut -

  • Atomicity - Entah transaksi selesai atau tidak ada yang terjadi sama sekali.

  • Consistency - Sebuah transaksi harus dimulai dalam keadaan yang konsisten dan membiarkan sistem dalam keadaan yang konsisten.

  • Isolation - Hasil antara transaksi tidak terlihat di luar transaksi saat ini.

  • Durability - Setelah transaksi dilakukan, efeknya tetap ada, bahkan setelah kegagalan sistem.

Transaksi dimulai dengan MULAI TRANSAKSI; dan diakhiri dengan pernyataan komit atau kembalikan.

Mulai Transaksi

Untuk memulai transaksi, kita perlu menjalankan pernyataan berikut di Lua, dengan asumsi conn adalah koneksi MySQL terbuka.

conn:execute([[START TRANSACTION;]])

Transaksi Rollback

Kita perlu mengeksekusi pernyataan berikut untuk mengembalikan perubahan yang dibuat setelah transaksi awal dijalankan.

conn:execute([[ROLLBACK;]])

Lakukan Transaksi

Kita perlu menjalankan pernyataan berikut untuk melakukan perubahan yang dibuat setelah transaksi awal dijalankan.

conn:execute([[COMMIT;]])

Kami telah mengetahui tentang MySQL di atas dan bagian berikut menjelaskan tentang operasi SQL dasar. Ingat transaksi, meskipun tidak dijelaskan lagi untuk SQLite3 tetapi pernyataan yang sama juga harus berfungsi untuk SQLite3.

Mengimpor SQLite

Kita bisa menggunakan pernyataan memerlukan sederhana untuk mengimpor pustaka SQLite dengan asumsi bahwa implementasi Lua Anda dilakukan dengan benar. Selama instalasi, folder libsql yang berisi file terkait database.

sqlite3 = require "luasql.sqlite3"

Variabel sqlite3 akan memberikan akses ke fungsi dengan mengacu pada tabel utama sqlite3.

Menyiapkan Koneksi

Kita dapat mengatur koneksi dengan memulai lingkungan SQLite dan kemudian membuat koneksi untuk lingkungan tersebut. Itu ditunjukkan di bawah ini.

local env  = sqlite3.sqlite3()
local conn = env:connect('mydb.sqlite')

Koneksi di atas akan terhubung ke file SQLite yang ada atau membuat file SQLite baru dan membuat koneksi dengan file yang baru dibuat.

Jalankan Fungsi

Ada fungsi eksekusi sederhana yang tersedia dengan koneksi yang akan membantu kita melakukan semua operasi db mulai dari membuat, menyisipkan, menghapus, memperbarui, dan sebagainya. Sintaksnya ditunjukkan di bawah ini -

conn:execute([[ 'SQLite3STATEMENT' ]])

Dalam sintaks di atas kita perlu memastikan bahwa conn terbuka dan koneksi sqlite3 sudah ada dan mengganti 'SQLite3STATEMENT' dengan pernyataan yang benar.

Buat Contoh Tabel

Contoh buat tabel sederhana ditunjukkan di bawah ini. Ini membuat tabel dengan dua id parameter tipe integer dan nama tipe varchar.

sqlite3 = require "luasql.sqlite3"

local env  = sqlite3.sqlite3()
local conn = env:connect('mydb.sqlite')
print(env,conn)

status,errorString = conn:execute([[CREATE TABLE sample ('id' INTEGER, 'name' TEXT)]])
print(status,errorString )

Ketika Anda menjalankan program di atas, akan dibuat tabel bernama sample dengan dua kolom yaitu, id dan name.

SQLite3 environment (003EC918)	SQLite3 connection (00421F08)
0	nil

Jika terjadi kesalahan, Anda akan dikembalikan ke pernyataan kesalahan, bukan nihil. Pernyataan kesalahan sederhana ditunjukkan di bawah ini.

LuaSQL: unrecognized token: ""'id' INTEGER, 'name' TEXT)"

Sisipkan Contoh Pernyataan

Pernyataan sisipan untuk SQLite ditunjukkan di bawah ini.

conn:execute([[INSERT INTO sample values('11','Raj')]])

Pilih Contoh Pernyataan

Sejauh menyangkut pernyataan pilih, kita perlu melakukan perulangan melalui setiap baris dan mengekstrak data yang diperlukan. Pernyataan pemilihan sederhana ditunjukkan di bawah ini.

cursor,errorString = conn:execute([[select * from sample]])
row = cursor:fetch ({}, "a")

while row do
   print(string.format("Id: %s, Name: %s", row.id, row.name))
   -- reusing the table of results
   row = cursor:fetch (row, "a")
end

Dalam kode di atas, samb adalah koneksi sqlite3 terbuka. Dengan bantuan kursor yang dikembalikan oleh pernyataan eksekusi, Anda dapat mengulang melalui respons tabel dan mengambil data pilihan yang diperlukan.

Contoh Lengkap

Contoh lengkap termasuk semua pernyataan di atas diberikan di bawah ini.

sqlite3 = require "luasql.sqlite3"

local env  = sqlite3.sqlite3()
local conn = env:connect('mydb.sqlite')
print(env,conn)

status,errorString = conn:execute([[CREATE TABLE sample ('id' INTEGER, 'name' TEXT)]])
print(status,errorString )

status,errorString = conn:execute([[INSERT INTO sample values('1','Raj')]])
print(status,errorString )

cursor,errorString = conn:execute([[select * from sample]])
print(cursor,errorString)

row = cursor:fetch ({}, "a")

while row do
   print(string.format("Id: %s, Name: %s", row.id, row.name))
   row = cursor:fetch (row, "a")
end

-- close everything
cursor:close()
conn:close()
env:close()

Saat Anda menjalankan program di atas, Anda akan mendapatkan output berikut.

SQLite3 environment (005EC918)	SQLite3 connection (005E77B0)
0	nil
1	nil
SQLite3 cursor (005E9200)	nil
Id: 1, Name: Raj

Kami dapat menjalankan semua kueri yang tersedia dengan bantuan perpustakaan libsql ini. Jadi, tolong jangan berhenti dengan contoh-contoh ini. Lakukan eksperimen berbagai pernyataan kueri yang tersedia di masing-masing MySQL, SQLite3, dan db lain yang didukung di Lua.

Lua digunakan di banyak mesin game karena struktur bahasa dan sintaksnya yang sederhana. Fitur pengumpulan sampah seringkali cukup berguna dalam permainan yang menghabiskan banyak memori karena grafis yang kaya digunakan. Beberapa mesin game yang menggunakan Lua termasuk -

  • SDK Corona
  • Gideros Mobile
  • ShiVa3D
  • Moai SDK
  • LOVE
  • CryEngine

Masing-masing mesin permainan ini didasarkan pada Lua dan ada sekumpulan API lengkap yang tersedia di masing-masing mesin ini. Kami akan melihat kemampuan masing-masing secara singkat.

SDK Corona

Corona SDK adalah mesin game seluler lintas platform yang mendukung platform iPhone, iPad, dan Android. Ada versi gratis dari Corona SDK yang dapat digunakan untuk permainan kecil dengan fitur terbatas. Anda dapat meningkatkan ke versi lain jika diperlukan.

Corona SDK menyediakan sejumlah fitur yang meliputi:

  • API penanganan Fisika dan Tabrakan
  • API Web dan Jaringan
  • API Jaringan Game
  • API Iklan
  • API Analytics
  • API Database dan Sistem File
  • Crypto dan Math API
  • API Audio dan Media

Lebih mudah dan lebih cepat untuk mengembangkan aplikasi menggunakan API di atas daripada menggunakan API asli secara terpisah untuk iOS dan Android.

Gideros Mobile

Gideros menyediakan SDK lintas platform untuk membuat game untuk iOS dan Android. Ini gratis untuk digunakan dengan percikan yang dibuat dengan Gideros. Beberapa keuntungan mencolok di Gideoros meliputi, berikut ini -

  • Development IDE - Ini menyediakan IDE-nya sendiri yang membuatnya lebih mudah untuk mengembangkan aplikasi Gideros.

  • Instant testing- Saat mengembangkan game Anda, game ini dapat diuji di perangkat nyata melalui Wifi hanya dalam 1 detik. Anda tidak perlu membuang waktu Anda dengan proses ekspor atau penerapan.

  • Plugins- Anda dapat dengan mudah memperluas inti dengan plugin. Impor kode (C, C ++, Java atau Obj-C) yang ada, ikat ke Lua dan tafsirkan secara langsung. Lusinan plugin open source telah dikembangkan dan siap digunakan.

  • Clean OOP approach - Gideros menyediakan sistem kelasnya sendiri dengan semua standar OOP dasar, memungkinkan Anda menulis kode yang bersih dan dapat digunakan kembali untuk game apa pun di masa mendatang.

  • Native speed - Dikembangkan di atas C / C ++ dan OpenGL, game Anda berjalan dengan kecepatan asli dan sepenuhnya memanfaatkan kekuatan CPU dan GPU di bawahnya.

ShiVa3D

ShiVa3D adalah salah satu mesin permainan 3D yang menyediakan editor grafis yang dirancang untuk membuat aplikasi dan permainan video untuk Web, Konsol, dan perangkat Seluler. Ini mendukung berbagai platform yang meliputi, Windows, Mac, Linux, iOS, Android, BlackBerry, Palm OS, Wii dan WebOS.

Beberapa fitur utama termasuk

  • Plugin standar
  • API modifikasi mesh
  • IDE
  • Editor Terrain, Laut, dan animasi bawaan
  • Dukungan mesin fisika ODE
  • Kontrol lightmap penuh
  • Pratinjau langsung untuk materi, partikel, jejak, dan HUD
  • Dukungan format pertukaran Collada

Edisi web Shiva3d sepenuhnya gratis dan edisi lain Anda harus berlangganan.

Moai SDK

Moai SDK adalah mesin game seluler lintas platform yang mendukung platform iPhone, iPad, dan Android. Platform Moai awalnya terdiri dari Moai SDK, mesin game open source, dan Moai Cloud, platform cloud sebagai layanan untuk hosting dan penyebaran layanan game. Sekarang Moai Cloud dimatikan dan hanya mesin game yang tersedia.

Moai SDK berjalan di berbagai platform termasuk iOS, Android, Chrome, Windows, Mac dan Linux.

CINTA

CINTA adalah framework yang bisa Anda gunakan untuk membuat game 2D. Ini gratis dan open-source. Ini mendukung platform Windows, Mac OS X dan Linux.

Ini menyediakan banyak fitur yang meliputi,

  • API Audio
  • API Sistem File
  • Keyboard dan Joystick API
  • API Matematika
  • Window dan Mouse API
  • API Fisika
  • API sistem dan timer

Mesin menangis

CryEngine adalah mesin game yang dikembangkan oleh pengembang game Jerman, Crytek. Ini telah berevolusi dari generasi 1 ke generasi 4 dan merupakan solusi pengembangan lanjutan. Ini mendukung game PC, Xbox 360, PlayStation3 dan WiiU.

Ini menyediakan banyak fitur yang meliputi,

  • Efek visual seperti Pencahayaan Alami & Bayangan Lembut Dinamis, Iluminasi Global Dinamis Real-time, Volume Propagasi Cahaya, Bayangan Partikel, Tessellation, dan sebagainya.

  • Sistem Animasi Karakter dan Sistem Individualisasi Karakter.

  • Animasi Kerangka Parametrik dan Editor Animasi Wajah Khusus yang Unik

  • Sistem AI seperti Multi-Layer Navigation Mesh dan Tactical Point System. Juga menyediakan Sistem Pengeditan AI yang Ramah Desainer.

  • Dalam Game Mixing & Profiling, Sound System Suara Dinamis Sistem Suara & Musik Interaktif dan sebagainya.

  • Fitur Fisika seperti Deformasi Prosedural dan Fisika Tali Tingkat Lanjut.

Catatan Akhir

Masing-masing Game SDK / framework ini memiliki kelebihan dan kekurangannya masing-masing. Pilihan yang tepat di antara mereka membuat tugas Anda lebih mudah dan Anda dapat bersenang-senang dengannya. Jadi, sebelum menggunakannya, Anda perlu mengetahui persyaratan untuk game Anda dan kemudian menganalisis mana yang memenuhi semua kebutuhan Anda dan kemudian harus menggunakannya.

Pustaka standar Lua menyediakan sekumpulan fungsi yang kaya yang diimplementasikan langsung dengan C API dan dibangun dengan bahasa pemrograman Lua. Library ini menyediakan layanan dalam bahasa pemrograman Lua dan juga layanan luar seperti operasi file dan db.

Pustaka standar yang dibangun di C API resmi ini disediakan sebagai modul C terpisah. Ini termasuk yang berikut -

  • Pustaka dasar, yang mencakup sub pustaka coroutine
  • Pustaka modul
  • Manipulasi string
  • Manipulasi tabel
  • Perpustakaan matematika
  • Masukan dan Keluaran File
  • Fasilitas sistem operasi
  • Fasilitas debug

Perpustakaan Dasar

Kami telah menggunakan pustaka dasar sepanjang tutorial dalam berbagai topik. Tabel berikut menyediakan tautan dari halaman terkait dan daftar fungsi yang tercakup dalam berbagai bagian dari tutorial Lua ini.

Sr.No. Perpustakaan / Metode & Tujuan
1

Error Handling

Termasuk fungsi penanganan error seperti assert, error seperti yang dijelaskan di Lua - Penanganan Error .

2

Memory Management

Termasuk fungsi manajemen memori otomatis yang terkait dengan pengumpulan sampah seperti yang dijelaskan di Lua - Pengumpulan Sampah .

3

dofile ([filename])

Ini membuka file dan mengeksekusi konten file sebagai potongan. Jika tidak ada parameter yang dilewatkan, maka fungsi ini mengeksekusi konten input standar. Kesalahan akan disebarkan ke pemanggil.

4

_G

Demikianlah variabel global yang menampung lingkungan global (yaitu, _G._G = _G). Lua sendiri tidak menggunakan variabel ini.

5

getfenv ([f])

Mengembalikan lingkungan saat ini yang digunakan oleh fungsi. f dapat berupa fungsi Lua atau angka yang menetapkan fungsi pada level stack itu - Level 1 adalah fungsi yang memanggil getfenv. Jika fungsi yang diberikan bukan fungsi Lua, atau jika f adalah 0, getfenv mengembalikan lingkungan global. Default untuk f adalah 1.

6

getmetatable (object)

Jika objek tidak memiliki metatabel, mengembalikan nihil. Sebaliknya, jika metatabel objek memiliki bidang "__metatable", mengembalikan nilai terkait. Jika tidak, mengembalikan metatabel dari objek yang diberikan.

7

ipairs (t)

Fungsi ini mengambil indeks dan nilai tabel.

8

load (func [, chunkname])

Memuat potongan menggunakan function func untuk mendapatkan potongannya. Setiap panggilan ke func harus mengembalikan string yang digabungkan dengan hasil sebelumnya.

9

loadfile ([filename]))

Mirip dengan memuat, tetapi mendapatkan potongan dari nama file file atau dari input standar, jika tidak ada nama file yang diberikan.

10

loadstring (string [, chunkname])

Mirip dengan memuat, tetapi mendapat potongan dari string yang diberikan.

11

next (table [, index])

Mengizinkan program untuk melintasi semua bidang tabel. Argumen pertamanya adalah tabel dan argumen kedua adalah indeks dalam tabel ini. next mengembalikan indeks berikutnya dari tabel dan nilai yang terkait.

12

pairs (t)

Menangguhkan coroutine yang sedang berjalan. Parameter yang diteruskan ke metode ini bertindak sebagai nilai pengembalian tambahan ke fungsi resume.

13

print (...)

Menangguhkan coroutine yang sedang berjalan. Parameter yang diteruskan ke metode ini bertindak sebagai nilai pengembalian tambahan ke fungsi resume.

14

rawequal (v1, v2)

Memeriksa apakah v1 sama dengan v2, tanpa menggunakan metamethod. Mengembalikan boolean.

15

rawget (table, index)

Mendapatkan nilai sebenarnya dari tabel [indeks], tanpa menggunakan metode apa pun. tabel harus berupa tabel; indeks dapat berupa nilai apa pun.

16

rawset (table, index, value)

Menyetel nilai riil tabel [indeks] menjadi nilai, tanpa menggunakan metode apa pun. tabel harus berupa tabel, indeks nilai apa pun yang berbeda dari nil, dan nilai nilai Lua apa pun. Fungsi ini mengembalikan tabel.

17

select (index, ...)

Jika indeks adalah angka, kembalikan semua argumen setelah indeks nomor argumen. Jika tidak, indeks harus berupa string "#", dan pilih mengembalikan jumlah total argumen tambahan yang diterima.

18

setfenv (f, table)

Menyetel lingkungan yang akan digunakan oleh fungsi yang diberikan. f dapat berupa fungsi Lua atau angka yang menetapkan fungsi pada level stack itu - Level 1 adalah fungsi yang memanggil setfenv. setfenv mengembalikan fungsi yang diberikan. Sebagai kasus khusus, ketika f adalah 0 setfenv mengubah lingkungan thread yang sedang berjalan. Dalam kasus ini, setfenv tidak mengembalikan nilai.

19

setmetatable (table, metatable)

Menetapkan metatabel untuk tabel yang diberikan. (Anda tidak dapat mengubah metatabel jenis lain dari Lua, hanya dari C.) Jika metatabel adalah nihil, hapus metatabel dari tabel yang diberikan. Jika metatabel asli memiliki bidang "__metatable", menimbulkan kesalahan. Fungsi ini mengembalikan tabel.

20

tonumber (e [, base])

Mencoba mengubah argumennya menjadi angka. Jika argumen sudah berupa angka atau string yang dapat diubah menjadi angka, maka tonumber mengembalikan angka ini; jika tidak, hasilnya nihil.

21

tostring (e)

Menerima argumen jenis apa pun dan mengubahnya menjadi string dalam format yang wajar. Untuk kontrol penuh tentang bagaimana angka dikonversi, gunakan string.format.

22

type (v)

Mengembalikan tipe dari satu-satunya argumennya, yang dikodekan sebagai string. Hasil yang mungkin dari fungsi ini adalah "nil" (string, bukan nilai nil), "number", "string", "boolean", "table", "function", "thread", dan "userdata".

23

unpack (list [, i [, j]])

Mengembalikan elemen dari tabel yang diberikan.

24

_VERSION

Variabel global (bukan fungsi) yang menyimpan string yang berisi versi interpreter saat ini. Isi dari variabel ini adalah "Lua 5.1".

25

Coroutines

Termasuk fungsi manipulasi coroutine seperti yang dijelaskan di Lua - Coroutines .

Pustaka Modul

Pustaka modul menyediakan fungsi dasar untuk memuat modul di Lua. Ini mengekspor satu fungsi secara langsung di lingkungan global: membutuhkan. Semua yang lain diekspor dalam paket tabel. Rincian tentang pustaka modul dijelaskan di bab sebelumnya Lua - Tutorial modul .

Manipulasi string

Lua menyediakan sekumpulan fungsi manipulasi string yang kaya. Tutorial Lua - Strings sebelumnya membahas ini secara mendetail.

Manipulasi tabel

Lua bergantung pada tabel di hampir setiap bit operasinya. Tutorial Lua - Tabel sebelumnya membahas hal ini secara rinci.

Masukan dan Keluaran File

Kami sering membutuhkan fasilitas penyimpanan data dalam pemrograman dan ini disediakan oleh fungsi perpustakaan standar untuk file I / O di Lua. Hal ini dibahas dalam tutorial Lua - File I / O sebelumnya .

Fasilitas debug

Lua menyediakan pustaka debug yang menyediakan semua fungsi primitif bagi kita untuk membuat debugger kita sendiri. Hal ini dibahas dalam tutorial Lua - Debugging sebelumnya .

Kita sering membutuhkan operasi matematika dalam perhitungan ilmiah dan teknik dan kita dapat memanfaatkannya menggunakan matematika perpustakaan Lua standar. Daftar fungsi yang tersedia di pustaka matematika diperlihatkan dalam tabel berikut ini.

Sr.No. Perpustakaan / Metode & Tujuan
1

math.abs (x)

Mengembalikan nilai absolut dari x.

2

math.acos (x)

Mengembalikan busur kosinus x (dalam radian).

3

math.asin (x)

Mengembalikan busur sinus dari x (dalam radian).

4

math.atan (x)

Mengembalikan tangen busur dari x (dalam radian).

5

math.atan2 (y, x)

Mengembalikan tangen busur dari y / x (dalam radian), tetapi menggunakan tanda dari kedua parameter untuk mencari kuadran hasilnya. (Ini juga menangani dengan benar kasus x menjadi nol.)

6

math.ceil (x)

Mengembalikan bilangan bulat terkecil yang lebih besar dari atau sama dengan x.

7

math.cos (x)

Mengembalikan kosinus x (diasumsikan dalam radian).

8

math.cosh (x)

Mengembalikan kosinus hiperbolik x.

9

math.deg (x)

Mengembalikan sudut x (diberikan dalam radian) dalam derajat.

10

math.exp (x)

Mengembalikan nilai e pangkat x.

11

math.floor (x)

Mengembalikan bilangan bulat terbesar yang lebih kecil dari atau sama dengan x.

12

math.fmod (x, y)

Mengembalikan sisa pembagian x dengan y yang membulatkan hasil bagi menuju nol.

13

math.frexp (x)

Mengembalikan m dan e sehingga x = m2e, e adalah bilangan bulat dan nilai absolut m berada dalam kisaran [0,5, 1) (atau nol jika x adalah nol).

14

math.huge

Nilai HUGE_VAL, nilai yang lebih besar dari atau sama dengan nilai numerik lainnya.

15

math.ldexp (m, e)

Mengembalikan m2e (e harus berupa bilangan bulat).

16

math.log (x)

Mengembalikan logaritma natural dari x.

17

math.log10 (x)

Mengembalikan logaritma basis 10 dari x.

18

math.max (x, ...)

Mengembalikan nilai maksimum di antara argumennya.

19

math.min (x, ...)

Mengembalikan nilai minimum di antara argumennya.

20

math.modf (x)

Mengembalikan dua angka, bagian integral dari x dan bagian pecahan dari x.

21

math.pi

Nilai pi.

22

math.pow (x, y)

Mengembalikan xy. (Anda juga dapat menggunakan ekspresi x ^ y untuk menghitung nilai ini.)

23

math.rad (x)

Mengembalikan sudut x (diberikan dalam derajat) dalam radian.

24

math.random ([m [, n]])

Fungsi ini adalah antarmuka ke fungsi generator acak-semu sederhana rand yang disediakan oleh ANSI C. Ketika dipanggil tanpa argumen, mengembalikan bilangan riil pseudo-acak seragam dalam kisaran [0,1). Saat dipanggil dengan bilangan bulat m, math.random mengembalikan bilangan bulat acak semu yang seragam dalam rentang [1, m]. Saat dipanggil dengan dua bilangan bulat m dan n, math.random mengembalikan bilangan bulat acak semu yang seragam dalam rentang [m, n].

25

math.randomseed (x)

Menetapkan x sebagai "benih" untuk generator acak-semu: benih yang sama menghasilkan urutan angka yang sama.

26

math.sin (x)

Mengembalikan sinus dari x (diasumsikan dalam radian).

27

math.sinh (x)

Mengembalikan sinus hiperbolik x.

28

math.sqrt (x)

Mengembalikan akar kuadrat dari x. (Anda juga dapat menggunakan ekspresi x ^ 0,5 untuk menghitung nilai ini.)

29

math.tan (x)

Mengembalikan tangen dari x (diasumsikan dalam radian).

30

math.tanh (x)

Mengembalikan tangen hiperbolik x.

Fungsi trigonometri

Contoh sederhana menggunakan fungsi trigonometri ditunjukkan di bawah ini.

radianVal = math.rad(math.pi / 2)

io.write(radianVal,"\n")

-- Sin value of 90(math.pi / 2) degrees
io.write(string.format("%.1f ", math.sin(radianVal)),"\n")

-- Cos value of 90(math.pi / 2) degrees
io.write(string.format("%.1f ", math.cos(radianVal)),"\n")

-- Tan value of 90(math.pi / 2) degrees
io.write(string.format("%.1f ", math.tan(radianVal)),"\n")

-- Cosh value of 90(math.pi / 2) degrees
io.write(string.format("%.1f ", math.cosh(radianVal)),"\n")

-- Pi Value in degrees
io.write(math.deg(math.pi),"\n")

Saat kita menjalankan program di atas, kita akan mendapatkan output sebagai berikut.

0.027415567780804
0.0 
1.0 
0.0 
1.0 
180

Fungsi matematika umum lainnya

Contoh sederhana menggunakan fungsi matematika umum ditunjukkan di bawah ini.

-- Floor
io.write("Floor of 10.5055 is ", math.floor(10.5055),"\n")

-- Ceil
io.write("Ceil of 10.5055 is ", math.ceil(10.5055),"\n")

-- Square root
io.write("Square root of 16 is ",math.sqrt(16),"\n")

-- Power
io.write("10 power 2 is ",math.pow(10,2),"\n")
io.write("100 power 0.5 is ",math.pow(100,0.5),"\n")

-- Absolute
io.write("Absolute value of -10 is ",math.abs(-10),"\n")

--Random
math.randomseed(os.time())
io.write("Random number between 1 and 100 is ",math.random(),"\n")

--Random between 1 to 100
io.write("Random number between 1 and 100 is ",math.random(1,100),"\n")

--Max
io.write("Maximum in the input array is ",math.max(1,100,101,99,999),"\n")

--Min
io.write("Minimum in the input array is ",math.min(1,100,101,99,999),"\n")

Saat kita menjalankan program di atas, kita akan mendapatkan output sebagai berikut.

Floor of 10.5055 is 10
Ceil of 10.5055 is 11
Square root of 16 is 4
10 power 2 is 100
100 power 0.5 is 10
Absolute value of -10 is 10
Random number between 1 and 100 is 0.22876674703207
Random number between 1 and 100 is 7
Maximum in the input array is 999
Minimum in the input array is 1

Contoh di atas hanyalah beberapa dari contoh umum, kita dapat menggunakan pustaka matematika berdasarkan kebutuhan kita, jadi coba gunakan semua fungsi agar lebih familiar.

Dalam aplikasi apa pun, sering kali diperlukan untuk mengakses fungsi tingkat Sistem Operasi dan tersedia dengan pustaka Sistem Operasi. Daftar fungsi yang tersedia tercantum dalam tabel berikut.

Sr.No. Perpustakaan / Metode & Tujuan
1

os.clock ()

Mengembalikan perkiraan jumlah dalam detik dari waktu CPU yang digunakan oleh program.

2

os.date ([format [, time]])

Mengembalikan string atau tabel yang berisi tanggal dan waktu, diformat sesuai dengan format string yang diberikan.

3

os.difftime (t2, t1)

Mengembalikan jumlah detik dari waktu t1 ke waktu t2. Di POSIX, Windows, dan beberapa sistem lain, nilai ini persis t2-t1.

4

os.execute ([command])

Fungsi ini setara dengan sistem fungsi ANSI C. Ini melewati perintah untuk dieksekusi oleh shell sistem operasi. Hasil pertamanya benar jika perintah berhasil dihentikan, atau nihil sebaliknya.

5

os.exit ([code [, close])

Memanggil keluar fungsi ANSI C untuk menghentikan program host. Jika kode benar, status yang dikembalikan adalah EXIT_SUCCESS; jika kode salah, status yang dikembalikan adalah EXIT_FAILURE; jika kode adalah angka, status yang dikembalikan adalah nomor ini.

6

os.getenv (varname)

Mengembalikan nilai dari variabel lingkungan proses varname, atau nihil jika variabel tidak ditentukan.

7

os.remove (filename)

Menghapus file (atau direktori kosong, pada sistem POSIX) dengan nama yang diberikan. Jika fungsi ini gagal, ia mengembalikan nihil, ditambah string yang menjelaskan kesalahan dan kode kesalahan.

8

os.rename (oldname, newname)

Ubah nama file atau direktori dengan nama lama menjadi nama baru. Jika fungsi ini gagal, ia mengembalikan nihil, ditambah string yang menjelaskan kesalahan dan kode kesalahan.

9

os.setlocale (locale [, category])

Menetapkan lokal program saat ini. locale adalah string bergantung sistem yang menentukan lokal; kategori adalah string opsional yang menjelaskan kategori mana yang akan diubah: "all", "collate", "ctype", "moneter", "numerik", atau "waktu"; kategori default adalah "semua". Fungsi mengembalikan nama lokal baru, atau nihil jika permintaan tidak dapat dipenuhi.

10

os.time ([table])

Mengembalikan waktu saat ini ketika dipanggil tanpa argumen, atau waktu yang mewakili tanggal dan waktu yang ditentukan oleh tabel yang diberikan. Tabel ini harus memiliki field tahun, bulan, dan hari, dan mungkin memiliki field hour (default adalah 12), min (default adalah 0), sec (default adalah 0), dan isdst (default adalah nil). Untuk deskripsi bidang ini, lihat fungsi os.date.

11

os.tmpname ()

Mengembalikan string dengan nama file yang dapat digunakan untuk file sementara. File harus dibuka secara eksplisit sebelum digunakan dan dihapus secara eksplisit saat tidak lagi diperlukan.

Fungsi OS umum

Contoh sederhana menggunakan fungsi matematika umum ditunjukkan di bawah ini.

-- Date with format
io.write("The date is ", os.date("%m/%d/%Y"),"\n")

-- Date and time
io.write("The date and time is ", os.date(),"\n")

-- Time
io.write("The OS time is ", os.time(),"\n")

-- Wait for some time
for i=1,1000000 do
end

-- Time since Lua started
io.write("Lua started before ", os.clock(),"\n")

Ketika kita menjalankan program di atas, kita akan mendapatkan keluaran yang mirip dengan yang berikut ini.

The date is 01/25/2014
The date and time is 01/25/14 07:38:40
The OS time is 1390615720
Lua started before 0.013

Contoh di atas hanyalah sebagian kecil dari contoh umum, kita dapat menggunakan perpustakaan OS berdasarkan kebutuhan kita, jadi coba gunakan semua fungsi agar lebih familiar. Ada fungsi seperti remove yang membantu menghapus file, mengeksekusi yang membantu kita menjalankan perintah OS seperti dijelaskan di atas.