Ingin tahu segalanya. bahasa Lu. Lihat apa itu "Lua" di kamus lain Belajar lua dari awal

Skrip Lua

Sebuah skrip yang ditulis dalam Lua tidak memiliki fungsi khusus dari mana eksekusinya akan dimulai. Sebuah skrip dapat dilihat secara sederhana sebagai sekumpulan perintah (instruksi) yang dijalankan mulai dari instruksi pertama.

Scriptnya bisa sangat sederhana, hanya terdiri dari satu perintah, atau sangat kompleks, berisi puluhan, ratusan atau bahkan ribuan instruksi. Instruksi berikut dapat dipisahkan dengan titik koma (;). Namun, persyaratan ini tidak wajib, jadi semua kode di bawah ini benar dari segi sintaks:

Bekerja dengan variabel di Lua

Variabel digunakan untuk menyimpan nilai selama eksekusi skrip.

Nama variabel di Lua

Nama variabel (pengidentifikasi) di Lua dapat berupa urutan huruf, angka, dan garis bawah apa pun yang tidak dimulai dengan angka.

catatan

Bahasa Lua peka huruf besar/kecil, jadi abc, Abc, ABC adalah nama yang berbeda.

Tabel di bawah ini mencantumkan kata-kata yang dicadangkan oleh bahasa Lua dan tidak dapat digunakan dalam nama variabel:

dan istirahat lakukan elseif

akhiri salah untuk fungsi jika

di lokal nihil tidak atau

ulangi kembali lalu benar sampai

Selain itu, semua nama yang dimulai dengan garis bawah diikuti oleh huruf kapital(mis. _VERSION) juga dicadangkan.

Apa saja variabel dalam Lua?

Variabel dalam Lua dapat berupa global atau lokal. Jika suatu variabel tidak secara eksplisit dideklarasikan lokal, itu dianggap global.

Variabel Global Lua

Variabel global muncul saat diberi nilai pertamanya. Sebelum menetapkan nilai pertama, mengakses variabel global menghasilkan nihil.

MsgBox(tostring(g)) --> nihil

MsgBox(tostring(g)) --> 1

Variabel global ada selama lingkungan eksekusi skrip ada dan tersedia untuk setiap kode Lua yang dieksekusi di lingkungan ini.

Jika perlu, Anda dapat menghapus variabel global secara eksplisit hanya dengan menyetelnya ke nil.

g = 1 - buat variabel global g dengan nilai 1

g = nil - hapus variabel global g

MsgBox(tostring(g)) --> nihil

Semua variabel global adalah bidang dalam tabel biasa yang disebut lingkungan global. Tabel ini tersedia melalui variabel global _G. Karena bidang lingkungan global adalah semua variabel global (termasuk _G itu sendiri), maka _G._G == _G.

Variabel Lokal Lua

Setiap variabel lokal harus dideklarasikan secara eksplisit menggunakan kata kunci lokal. Anda dapat mendeklarasikan variabel lokal di mana saja dalam skrip. Deklarasi dapat mencakup pemberian nilai awal ke variabel. Jika tidak ada nilai yang ditetapkan, variabel berisi nil.

lokal a - mendeklarasikan variabel lokal a

lokal b = 1 - mendeklarasikan variabel lokal b, menetapkan nilai 1 untuk itu

lokal c, d = 2, 3 - nyatakan variabel lokal c dan d, berikan nilai 2 dan 3

Ruang lingkup variabel lokal dimulai setelah deklarasi dan berlanjut hingga akhir blok.

Catatan

Ruang lingkup variabel adalah bagian dari kode program di mana Anda dapat mengakses nilai yang disimpan dalam variabel ini.

Blok berarti:

badan struktur kontrol (jika-maka, yang lain, untuk, sementara, ulangi);

fungsi tubuh;

sepotong kode terlampir dalam kata kunci do...end.

Jika variabel lokal didefinisikan di luar blok apa pun, cakupannya meluas ke akhir skrip.

lokal i = 1 - variabel i lokal dalam skrip

ketika saya<= a do - цикл от 1 до 5

lokal a = i^2 - variabel a adalah lokal di dalam loop sementara

MsgBox(a) --> 1, 4, 9, 16, 25

MsgBox(a) -->

jika saya > 5 maka

lokal a - variabel a adalah lokal di dalam maka

MsgBox(a) --> 10

MsgBox(a) --> 5 (merujuk ke global a di sini)

lokal a = 20 - variabel a adalah lokal di dalam do-end

MsgBox(a) --> 20

MsgBox(a) --> 5 (merujuk ke global a di sini)

catatan

Bila memungkinkan, disarankan untuk menggunakan variabel lokal daripada variabel global. Ini akan menghindari polusi namespace global dan memberikan kinerja yang lebih baik (karena mengakses variabel lokal di Lua sedikit lebih cepat daripada mengakses variabel global).

Tipe Data Lua

Tipe data apa yang didukung oleh bahasa Lua?

Lua mendukung tipe data berikut:

1. Nihil (tidak ada). Sesuai dengan tidak adanya nilai untuk variabel. Tipe ini diwakili oleh nilai tunggal, nihil.

2. Boolean (logis). Tipe ini meliputi nilai false (salah) dan true (benar).

Saat melakukan operasi logika, nilai nil dianggap salah. Semua nilai lain, termasuk angka 0 dan string kosong, dianggap benar.

3. Angka (numerik). Digunakan untuk mewakili nilai numerik.

Konstanta numerik dapat memiliki bagian pecahan opsional dan eksponen desimal opsional yang ditentukan oleh karakter "e" atau "E". Konstanta bilangan bulat dapat ditentukan dalam heksadesimal menggunakan awalan 0x.

Contoh konstanta numerik yang valid: 3, 3.0, 3.1415926, 314.16e-2, 0xff.

4. Tali (tali). Digunakan untuk mewakili string.

Nilai string ditentukan sebagai urutan karakter yang diapit oleh tanda kutip tunggal atau ganda:

a = "ini adalah string"

b = "ini adalah baris kedua"

String yang diapit tanda kutip ganda dapat menginterpretasikan urutan escape seperti C yang dimulai dengan karakter "\" (garis miring terbalik):

\b (spasi),

\n (umpan baris),

\r (pengembalian kereta);

\t (tab horizontal),

\\ (garis miring terbalik);

\"" (kutipan ganda);

\" (kutipan tunggal).

catatan

Karakter dalam string juga dapat diwakili oleh kodenya menggunakan urutan escape:

di mana ddd adalah urutan tidak lebih dari tiga digit.

Selain tanda kutip, tanda kurung siku ganda juga dapat digunakan untuk mendefinisikan string:

Mendefinisikan string dengan tanda kurung siku ganda memungkinkan Anda untuk mengabaikan semua urutan escape, yaitu string dibuat sepenuhnya seperti yang dijelaskan:

lokal a = [] di Lua]=]

Akan ada istilah: "string[] definisi di Lua"

5. Fungsi (fungsi). Fungsi di Lua dapat ditulis ke variabel, diteruskan sebagai parameter ke fungsi lain, dan dikembalikan sebagai hasil eksekusi fungsi.

6. Meja (tabel). Tabel adalah sekumpulan pasangan "kunci" - "nilai", yang disebut bidang atau elemen tabel. Baik kunci dan nilai bidang tabel dapat berupa jenis apa pun kecuali nihil. Tabel tidak memiliki ukuran tetap: kapan saja, Anda dapat menambahkan sejumlah elemen ke dalamnya.

Baca lebih lanjut di artikel "Membuat tabel di Lua"

7. Data pengguna (data pengguna). Ini adalah tipe data khusus. Nilai jenis ini tidak dapat dibuat atau dimodifikasi secara langsung dalam skrip Lua.

Userdata digunakan untuk mewakili tipe baru yang dibuat dalam pemanggil skrip atau di pustaka yang ditulis dalam C. Misalnya, pustaka ekstensi Lua untuk "CronosPRO" menggunakan tipe ini untuk mewakili objek seperti:

bank data (kelas Bank);

database (kelas Base);

catatan (Rekam kelas), dll.

8. Benang (benang). Sesuai dengan alur eksekusi. Aliran ini sama sekali tidak terkait dengan sistem operasi dan didukung secara eksklusif melalui Lua itu sendiri.

Bagaimana cara mengatur tipe variabel di Lua?

Lua tidak secara eksplisit menentukan tipe variabel. Jenis variabel diatur pada saat variabel diberi nilai. Variabel apa pun dapat diberi nilai jenis apa pun (terlepas dari jenis apa yang ada sebelumnya).

a = 123 - variabel a memiliki nomor tipe

a = "123" - sekarang variabel a bertipe string

a = true - variabel a sekarang bertipe boolean

a = () - sekarang variabel a bertipe tabel

catatan

Variabel tipe tabel, fungsi, utas dan data pengguna tidak berisi data itu sendiri, tetapi menyimpan referensi ke objek yang sesuai. Saat menetapkan, meneruskan ke fungsi sebagai argumen dan kembali dari fungsi sebagai hasilnya, objek tidak disalin, hanya referensi yang disalin.

a = () - membuat tabel. Referensi ke tabel ditempatkan dalam variabel a

b = a - variabel b mengacu pada tabel yang sama dengan a

a = 10 - elemen tabel dengan indeks 1 diberi nilai 10

MsgBox(b) --> "10"

MsgBox(a) --> "20"

Sisa data adalah nilai langsung.

MsgBox(a) --> "20"

MsgBox(b) --> "10"

Bagaimana cara mendapatkan tipe variabel di Lua?

Jenis nilai yang disimpan dalam variabel dapat ditemukan dengan menggunakan tipe fungsi standar. Fungsi ini mengembalikan string yang berisi nama tipe ("nil", "angka", "string", "boolean", "tabel", "fungsi", "utas", "data pengguna").

t = type("ini adalah string") - t sama dengan "string"

t = tipe(123) - t adalah "angka"

t = type(type) - t sama dengan "fungsi"

t = tipe(benar) - t adalah "boolean"

t = type(nil) - t adalah "nil"

t = type(CroApp.GetBank()) - t sama dengan "userdata"

Bagaimana mengkonversi tipe variabel di Lua?

Lua secara otomatis mengubah angka menjadi string, dan sebaliknya, jika perlu. Misalnya, jika nilai string adalah operan dalam operasi aritmatika, itu akan diubah menjadi angka. Demikian juga, nilai numerik yang ditemui di mana string diharapkan akan dikonversi menjadi string.

a = "10" + 2 - a sama dengan 12

a = "10" + 2 - a sama dengan "10 + 2"

a = "-5.3e-10"*"2" - a sama dengan -1.06e-09

a = "string" + 2 - Kesalahan! Tidak dapat mengonversi "string" menjadi angka

Nilai jenis apa pun dapat secara eksplisit dikonversi ke string menggunakan fungsi tostring standar.

a = tostring(10) - a adalah "10"

a = tostring(true) - a sama dengan "true"

a = tostring(nil) - a sama dengan "nil"

a = tostring (( = "ini adalah bidang 1")) - a sama dengan "tabel: 06DB1058"

Dari contoh sebelumnya, Anda dapat melihat bahwa isi tabel tidak dikonversi oleh fungsi tostring. Transformasi ini dapat dilakukan dengan menggunakan fungsi render.

a = render(10) - a adalah "10"

a = render(true) - a sama dengan "true"

a = render(nil) - a adalah "nil"

a = render (( = "ini adalah bidang 1")) - a adalah "( = "ini adalah bidang 1")"

Untuk secara eksplisit mengonversi nilai ke angka, Anda dapat menggunakan fungsi tonumber standar. Jika nilainya adalah string yang dapat dikonversi menjadi angka (atau sudah berupa angka), fungsi akan mengembalikan hasil konversi, jika tidak maka akan mengembalikan nihil.

a = tonumber("10") - a sama dengan "10"

a = tonumber("10"..5") - a sama dengan 10.5

a = tonumber(true) - a sama dengan "nil"

a = tonumber (nil) - a sama dengan "nil"

Susunan komentar di Lua

Sebuah komentar di Lua dimulai dengan dua tanda minus (--) dan berlanjut ke akhir baris.

lokal a = 1 - komentar satu baris

Jika dua kurung siku pembuka ([[) segera mengikuti karakter "--", komentarnya adalah multi-baris dan berlanjut hingga dua kurung siku penutup (]]).

lokal a = 1 - [[ multiline

komentar ]]

Tanda kurung ganda dalam komentar dapat disarangkan. Agar tidak membingungkan mereka, tanda sama dengan (=) dimasukkan di antara tanda kurung:

lokal a = [[Perusahaan Kronos]] - [=[

lokal a = [[Perusahaan Kronos]]

Jumlah "=" karakter menentukan sarang:

local a = [=[definisi beberapa string [] di Lua]=] --[==[

local a = [=[definisi beberapa string [] di Lua]=]

Operasi yang digunakan di Lua

Dalam ekspresi yang ditulis dalam Lua, jenis operasi berikut dapat digunakan:

1. Operasi aritmatika.

Lua mendukung operasi aritmatika berikut:

+ (tambahan);

- (pengurangan);

* (perkalian);

/ (pembagian);

^ (eksponensial);

% (sisa pembagian).

catatan

Operasi aritmatika berlaku untuk angka dan string, yang dalam hal ini dikonversi ke angka.

2. Operasi perbandingan.

Operasi perbandingan nilai berikut ini diperbolehkan di Lua:

== (sama dengan);

~= (tidak sama);

< (меньше);

> (lebih besar);

<= (меньше или равно);

>= (lebih besar atau sama dengan).

catatan

Operasi perbandingan selalu mengembalikan nilai boolean benar atau salah.

Aturan untuk mengonversi angka menjadi string (dan sebaliknya) tidak berfungsi selama perbandingan, yaitu ekspresi "0" == 0 menghasilkan false.

3. Operasi logika.

Operasi logikanya adalah:

dan (logis DAN).

Operator and mengembalikan operan pertamanya jika bernilai false atau nihil. Jika tidak, operasi mengembalikan operan kedua (dan operan ini dapat berupa jenis apa pun).

a = (nil dan 5) - a sama dengan nil

a == (salah dan 5) - a salah

a == (4 dan 5) - a sama dengan 5

atau (logis ATAU).

Operator or mengembalikan operan pertama jika tidak salah atau nihil, jika tidak mengembalikan operan kedua.

a == (4 atau 5) - a sama dengan 4

a == (salah atau 5) - a sama dengan 5

catatan

asah otak operasi dan dan atau dapat mengembalikan nilai jenis apa pun.

Operasi logis dan dan atau mengevaluasi nilai operan kedua hanya jika perlu dikembalikan. Jika tidak diperlukan, operan kedua tidak dievaluasi. Sebagai contoh:

a == (4 atau f()) - fungsi f() tidak akan dipanggil

tidak (tidak logis).

Operator not selalu mengembalikan nilai true atau false.

4. Operasi penggabungan.

Untuk menggabungkan (menggabungkan) string, gunakan operasi ... (dua titik).

a = "Kronos"."-"."Inform" - variabel a akan mendapatkan nilai "Kronos-Inform"

catatan

Jika satu atau kedua operan adalah angka, mereka dikonversi menjadi string.

a = 0.1 - variabel a akan mendapatkan nilai "01"

5. Operasi mendapatkan panjang.

Lua mendefinisikan operator panjang #, yang dapat digunakan untuk mendapatkan panjang string.

a = "tali"

len = #a - len sama dengan 6

len = #"satu baris lagi" - len adalah 10

catatan

Anda juga dapat menggunakan operator # untuk mengetahui indeks (atau ukuran) maksimum array. Untuk lebih jelasnya, lihat artikel "Bekerja dengan array di Lua".

Prioritas operator di Lua

Di Lua, operasi dilakukan sesuai dengan prioritas berikut (dalam urutan menurun):

2. bukan # - (unary)

6. < > <= >= ~= ==

Memanggil skrip dari formulir

Setiap formulir (termasuk formulir bersarang) memiliki skrip terpisah yang terkait dengannya, yang biasanya berisi fungsi yang menangani kejadian formulir dan elemennya.

Saat formulir dijalankan, skripnya dimuat ke lingkungan global. Ketika sebuah event dari form atau elemennya terjadi, sistem akan memanggil fungsi handler yang terkait dengan event ini.

Perlu dicatat bahwa skrip formulir, meskipun tidak berisi panggilan ke fungsi modul, sebenarnya adalah modul. Ini berarti bahwa variabel yang dideklarasikan dalam skrip formulir tanpa kata kunci lokal tidak terpapar ke lingkungan global dan hanya tersedia di dalam skrip ini. Jika suatu nilai perlu disediakan untuk skrip formulir lain, nilai tersebut harus didefinisikan secara eksplisit dalam tabel _G global:

lokal a = _G.var

Blok pernyataan (instruksi)

Operator Lua utama adalah:

penugasan;

operator bersyarat;

operator untuk mengatur siklus.

Sekelompok pernyataan dapat digabungkan menjadi sebuah blok (pernyataan gabungan) menggunakan konstruksi do...end.

lakukan - awal blok

<оператор1>- tubuh blok

<оператор2>

<операторN>

akhir - akhir blok

Blok membuka ruang lingkup baru di mana Anda dapat menentukan variabel lokal.

a = 5 - variabel global a

lokal a = 20 - variabel lokal a didefinisikan di dalam do-end

MsgBox(a) --> 20

MsgBox(a) --> 5 (di sini referensi sudah ke global a)

Operator penugasan di Lua

Tugas mengubah nilai bidang variabel atau tabel. Dalam bentuknya yang paling sederhana, tugas mungkin terlihat seperti ini:

a = 1 - variabel a diberi nilai 1

a = b + c - variabel a diberikan jumlah nilai variabel b dan c

a = f(x) - variabel a diberi nilai yang dikembalikan oleh fungsi f(x)

Di Lua, apa yang disebut penugasan ganda diperbolehkan, ketika beberapa variabel di sebelah kiri operator penugasan menerima nilai dari beberapa ekspresi yang ditulis di sebelah kanan operator penugasan:

a, b = 1, 5*c - a sama dengan 1; b sama dengan 5*c

Jika ada lebih banyak variabel daripada nilai, variabel "ekstra" diberi nilai nihil.

a, b, c = 1, 2 - a sama dengan 1; b adalah 2; c sama dengan nihil

Jika ada lebih banyak nilai daripada variabel, nilai "ekstra" diabaikan.

a, b = 1, 2, 3 - a sama dengan 1; b adalah 2; nilai 3 tidak digunakan

Beberapa penugasan dapat digunakan untuk bertukar nilai antar variabel:

a = 10; b = 20 - a adalah 10, b adalah 20

a, b = b, a - sekarang a adalah 20, b adalah 10

Pernyataan bersyarat (jika) di Lua

Pernyataan if menguji kebenaran suatu kondisi tertentu. Jika kondisinya benar, bagian kode yang mengikuti kata kunci then (bagian then) akan dieksekusi. Jika tidak, kode yang mengikuti kata kunci else (bagian lain) akan dieksekusi.

jika a > b maka

kembalikan a - jika a lebih besar dari b, kembalikan a

kembalikan b - jika tidak, kembalikan b

Bagian lain adalah opsional.

jika sebuah< 0 then

a = 0 - jika a kurang dari 0, atur a ke 0

Anda dapat menggunakan konstruksi elseif alih-alih pernyataan if bersarang. Misalnya, kode berikut:

akan lebih mudah dibaca jika Anda menggantinya dengan yang berikut:

kembalikan "Ivan" - jika a sama dengan 1

jika tidak == 2 maka

kembalikan "Peter" - jika a adalah 2

jika tidak == 3 maka

kembalikan "Sergey" - jika a sama dengan 3

kembalikan "Tidak ada pemain seperti itu" - jika tidak ada yang terdaftar

Loop dengan prasyarat (sementara) di Lua

Pernyataan while dirancang untuk mengatur siklus dengan prasyarat dan memiliki bentuk sebagai berikut:

ketika melakukan

... - badan lingkaran

Sebelum setiap iterasi dari loop, kondisinya diperiksa :

jika kondisinya salah, loop berakhir dan kontrol dipindahkan ke pernyataan pertama setelah pernyataan while;

jika kondisinya benar, tubuh loop dieksekusi, setelah itu semua tindakan diulang.

sementara i > 0 do - loop dari 10 ke 1

t[i] = "bidang"..i

a = (3, 5, 8, -6, 5)

sementara i > 0 do - cari nilai negatif dalam array

jika a[i]< 0 then break end - если найдено, прерываем цикл

i = i - 1 - jika tidak pergi ke elemen berikutnya

jika saya > 0 maka

MsgBox("Indeks nilai negatif: "..i)

MsgBox("Array tidak mengandung nilai negatif")

Catatan

Loop dengan postcondition (ulangi) di Lua

Operator pengulangan dirancang untuk mengatur siklus dengan kondisi akhir dan memiliki bentuk berikut:

... - badan lingkaran

sampai

Tubuh loop dieksekusi sampai kondisi tidak akan menjadi kenyataan. Kondisi diperiksa setelah eksekusi badan loop, jadi bagaimanapun juga, badan loop akan dieksekusi setidaknya sekali.

Jumlahkan nilai array a hingga jumlahnya melebihi 10

a = (3, 2, 5, 7, 9)

jumlah = jumlah + a[i]

sampai jumlah > 10

MsgBox("Menambahkan ..i.." item. Jumlah sama dengan "..jumlah)

Anda dapat menggunakan pernyataan break untuk keluar dari loop sebelum berakhir.

Catatan

Untuk informasi selengkapnya tentang fitur penggunaan pernyataan break, lihat artikel “Pernyataan break dan return”

Loop dengan pernyataan for di Lua

Pernyataan for dimaksudkan untuk mengatur perulangan dan memungkinkan dua bentuk penulisan:

sederhana (angka untuk);

diperpanjang (universal untuk).

bentuk sederhana untuk pernyataan

Bentuk sederhana dari pernyataan for adalah sebagai berikut:

untuk var = exp1, exp2, exp3 do

... - badan lingkaran

Tubuh loop dieksekusi untuk setiap nilai variabel loop (penghitung) var dalam rentang dari exp1 hingga exp2, dengan langkah exp3.

Catatan

Langkahnya mungkin tidak ditentukan. Dalam hal ini, diambil sama dengan 1.

untuk i = 1, 10 do - loop dari 1 hingga 10 dengan langkah 1

MsgBox("saya sama dengan"..i)

untuk i = 10, 1, -1 do - loop dari 10 ke 1 dengan langkah -1

MsgBox("saya sama dengan"..i)

catatan

Ekspresi exp1, exp2 dan exp3 dievaluasi hanya sekali, sebelum dimulainya loop. Jadi, pada contoh di bawah, fungsi f(x) akan dipanggil untuk menghitung batas atas loop hanya sekali:

untuk i = 1, f(x) do - loop dari 1 ke nilai yang dikembalikan oleh f()

MsgBox("saya sama dengan"..i)

Variabel loop bersifat lokal untuk pernyataan loop dan tidak didefinisikan di akhir loop.

untuk i = 1, 10 do - loop dari 1 ke nilai yang dikembalikan oleh f()

MsgBox("saya sama dengan"..i)

MsgBox("Setelah keluar dari loop, i is "..i") - Salah! saya sama dengan nihil

catatan

Nilai variabel loop tidak dapat diubah di dalam loop: konsekuensi dari perubahan seperti itu tidak dapat diprediksi.

Pernyataan break digunakan untuk keluar dari loop sebelum selesai.

a = (3, 5, 8, -6, 5)

untuk i = 1,#a do - cari nilai negatif dalam array

jika a[i]< 0 then - если найдено...

index = i - simpan indeks dari nilai yang ditemukan...

istirahat - dan putuskan loop

MsgBox("Indeks nilai negatif: "..index)

Catatan

Untuk informasi selengkapnya tentang fitur penggunaan pernyataan break, lihat artikel "Pernyataan break dan return")

LUÁ, iau, vb. trans. I. 1. Prinde un obiect n mână spre a l ine (şi a se servi de el) sau spre a l pune n altă parte. exp. A lua altă vorbă = a schimba (cu dibăcie) subiectul unei discuţii. A(şi) lua picioarele la spinare = a pleca… … Dicționar Român

lua- Logo Basisdaten Paradigmen: Skriptsprache, imperativ, funktional, objektorientiert … Deutsch Wikipedia

lua- [] Informasi Umum Paradigma Multiparadigma: interpretado, imperativo, funcional, orientado a objetos, basado en prototipos Apareció en … Wikipedia Espaol

LUA- Apparu en 1993 Auteur Luiz Henrique de Figueiredo, Roberto Ierusalimschy et Waldemar Celes Implementasi Lua, LuaJIT, LLVM Lua, LuaCLR, Nua, Lua A ... Wikipedia en Français

LUA- (portugiesisch für Mond) ist eine Skriptsprache zum Einbinden dalam Program, um diese leichter weiterentwickeln und warten zu können. Eine der besonderen Eigenschaften von Lua ist die geringe Größe des kompilierten Skript Interpreters. Lua wurde… … Wikipedia bahasa Jerman

lua- s. f. 1. O unico planeta satélite da Terra. 2. Tempo compreendido entre dois novilúnios. 3. Ms. 4.Cio. 5. O mesmo que peixe lua. 6. Disco de ouro ou prata que os Timores usam ao pescoço, como símbolo de… … Dicionario da Lingua Portuguesa

lua- dapat merujuk ke: * Lua (bahasa pemrograman), bahasa pemrograman yang ringan dan dapat diperluas * Lua (Yu Gi Oh! 5D s) * Lua (dewi), dewi Romawi * Lua (seni bela diri), seni bela diri tradisional Hawaii * Lua (lagu), single dari folk rock... ... Wikipedia

LUA singkatan: LUA last universal ancestor (juga diterjemahkan sebagai "Last universal ancestor" (Bahasa Inggris LUA, Last Universal Ancestor), jika tidak Last universal ancestor (English LUCA, last universal common ... ... Wikipedia

lua- (Del gót. lôfa, palma de la mano). 1. f. Especie de guante hecho de esparto y sin separaciones para los dedos, que sirve para limpiar las caballerías. 2. Maret Revés de las velas por la parte donde van cazadas con viento largo o en popa. 3. Maret… … Diccionario de la lengua española

lua- Lua, römische Göttin, Tochter des Saturnus, welcher nach der Schlacht zur Sühne des vergossenen Blutes erbeutete Waffen von dem Feldherrn verbrannt wurden … Pierer's Universal-Lexikon

LUA- Dea quaedam apud vett, a luendo, expiandoque nomen sortita, quae praeerat lustrationibus, et lustris. Vide Turneb. Iklan s. l. 16.c. 20.dst. 23.c. 23. dll. 19.c. 11. Eius meminit A. Gell. l. 13.c. 22. cum ait di perpustakaan Sacerdotum Pop. Rom … Hofmann J. Lexicon universale

Buku

  • Pemrograman Lua
  • Pemrograman dalam bahasa Lua. Panduan, Yerusalem ke Robert. Buku ini didedikasikan untuk salah satu bahasa tertanam paling populer - Lua. Bahasa ini telah digunakan di banyak game dan banyak aplikasi berbeda. Bahasa ini menggabungkan volume kecil ...

Saya seorang programmer sentimental. Terkadang saya jatuh cinta dengan bahasa pemrograman dan kemudian saya bisa membicarakannya selama berjam-jam. Saya akan berbagi salah satu jam ini dengan Anda.

lua? Apa ini?

Lua adalah bahasa embeddable sederhana (dapat diintegrasikan dengan program Anda yang ditulis dalam bahasa lain), ringan dan mudah dipahami, dengan tipe data tunggal, dengan sintaks yang seragam. Bahasa yang sempurna untuk dipelajari.

Untuk apa?

Lua mungkin berguna bagi Anda:

* jika Anda seorang gamer (plugin untuk World of Warcraft dan banyak game lainnya)
* jika Anda menulis game (sangat sering dalam game, mesin ditulis dalam C / C ++, dan AI - dalam Lua)
* jika Anda seorang pemrogram sistem (Anda dapat menulis plugin untuk nmap, wireshark, nginx dan utilitas lain di Lua)
* jika Anda seorang pengembang tertanam (Lua sangat cepat, kompak dan membutuhkan sumber daya yang sangat sedikit)

1. Belajar memprogram. Setidaknya sedikit. Tidak peduli bahasa apa.
2. Instal Lua. Untuk melakukannya, unduh versi 5.2 di sini (http://www.lua.org/download.html), atau cari di repositori. Versi 5.1 juga akan berfungsi, tetapi perlu diketahui bahwa ini sudah sangat tua.

Jalankan semua contoh dari artikel di terminal dengan perintah seperti "lua file.lua".

Kesan pertama

Lua adalah bahasa yang diketik secara dinamis (variabel mendapatkan tipe dengan cepat tergantung pada nilai yang ditetapkan). Anda dapat menulis di atasnya dalam gaya imperatif dan berorientasi objek atau fungsional (bahkan jika Anda tidak tahu bagaimana itu, tidak apa-apa, teruslah membaca). Inilah Hello world di Lua:

Aplikasi lua pertama saya: hello.lua print "hello world"; print("selamat tinggal dunia")

Apa yang bisa dikatakan tentang bahasa:

* komentar satu baris dimulai dengan dua tanda hubung "--"
* tanda kurung dan titik koma dapat dihilangkan

Operator bahasa

Himpunan pernyataan bersyarat dan loop cukup khas:

Pernyataan bersyarat (mungkin tidak ada cabang else) jika a == 0 lalu print("a adalah nol") else print("a is not zero") end -- bentuk pendek if/elseif/end (bukan switch/ case) jika a == 0 lalu print("zero") elseif a == 1 lalu print("one") elseif a == 2 lalu print("two") else print("other") end -- count loop untuk i = 1, 10 do print(i) end -- loop dengan prasyarat b = 5 sedangkan b > 0 do b = b - 1 end -- loop dengan postcondition ulangi b = b + 1 sampai b >= 5

BERPIKIR: apa arti dari loop "untuk i = 1, 10, 2 ... end"?

Dalam ekspresi, Anda dapat menggunakan operator berikut pada variabel:

* tugas: x = 0
* aritmatika: +, -, *, /, % (sisa), ^ (perpangkatan)
* logis: dan, atau, tidak
* perbandingan: >,<, ==, <=, >=, ~= (tidak sama, ya-ya, bukan "!=") yang biasa
* rangkaian string (operator ".."), misalnya: s1="halo"; s2="dunia"; s3=s1..s2
* panjang/ukuran (# operator): s="halo"; a = #s ('a' akan sama dengan 5).
* dapatkan elemen berdasarkan indeks, misalnya: s

Tidak ada operasi bit dalam bahasa untuk waktu yang lama, tetapi dalam versi 5.2, perpustakaan bit32 muncul, yang mengimplementasikannya (sebagai fungsi, bukan sebagai operator).

Tipe data

Saya berbohong kepada Anda ketika saya mengatakan bahwa bahasa itu memiliki satu tipe data. Ini memiliki banyak dari mereka (seperti setiap bahasa serius):

* nihil (sama sekali tidak ada)
* angka boolean (benar/salah)
* angka (angka) - tanpa pembagian menjadi bilangan bulat / nyata. Hanya angka.
* string - omong-omong, mereka sangat mirip dengan string di Pascal
* fungsi - ya, variabel dapat bertipe "fungsi"
* benang
* data sewenang-wenang (data pengguna)
* meja

Jika semuanya jelas dengan tipe pertama, lalu apa itu data pengguna? Ingatlah bahwa Lua adalah bahasa yang dapat disematkan dan biasanya bekerja sama dengan komponen program yang ditulis dalam bahasa lain. Jadi, komponen "asing" ini dapat membuat data untuk kebutuhan mereka sendiri dan menyimpan data ini bersama dengan objek lua. Jadi, data pengguna adalah bagian bawah air dari gunung es, yang, dari sudut pandang bahasa lua, tidak diperlukan, tetapi kita tidak bisa mengabaikannya.

Dan sekarang hal terpenting dalam bahasa - tabel.

meja

Saya berbohong kepada Anda lagi ketika saya mengatakan bahwa bahasa itu memiliki 8 tipe data. Anda dapat menganggap itu satu: semuanya adalah tabel (omong-omong, ini juga tidak benar). Tabel adalah struktur data yang sangat elegan, menggabungkan properti array, tabel hash ("kunci" - "nilai"), struktur, objek.

Jadi, berikut adalah contoh tabel sebagai larik: a = (1, 2, 3) -- larik dengan 3 elemen print(a) -- mencetak "2" karena indeks dihitung dari satu -- Dan tabel dalam bentuk sparse array (yang tidak memiliki semua elemen) a = () -- tabel kosong a = 1 a = 5

BERPIKIR: apa yang dimaksud dengan array sparse?

Dalam contoh di atas, tabel berperilaku seperti array, tetapi pada kenyataannya, kami memiliki kunci (indeks) dan nilai (elemen array). Dan pada saat yang sama, kunci dapat berupa jenis apa saja, bukan hanya angka:

A = () a["hello"] = true a["world"] = false a = 1 -- atau seperti ini: a = ( hello = 123, world = 456 ) print(a["hello")) print ( a.hello) sama dengan a["hello"], meskipun terlihat seperti struct dengan field

Omong-omong, karena tabel memiliki kunci dan nilai, Anda dapat mengulangi semua kunci dan nilainya yang sesuai dalam satu lingkaran:

T = ( a = 3, b = 4 ) untuk kunci, nilai berpasangan(t) lakukan print(kunci, nilai) -- akan mencetak "a 3", lalu akhir "b 4"

Tapi bagaimana dengan objek? Kami akan mempelajarinya nanti, pertama - tentang fungsi.

Fungsi

Berikut adalah contoh fungsi reguler.

Fungsi add(a, b) mengembalikan a + b end print(add(5, 3)) -- print "8"

Fungsi bahasa memungkinkan Anda untuk mengambil beberapa argumen dan mengembalikan beberapa argumen. Jadi argumen yang nilainya tidak ditentukan secara eksplisit dianggap sama dengan nihil.

BERPIKIR: mengapa Anda ingin mengembalikan banyak argumen?

Fungsi swap(a, b) return b, a end x, y = swap(x, y) -- ngomong-ngomong, ini bisa dilakukan tanpa fungsi: x, y = y, x -- dan jika fungsi kembali beberapa argumen, -- Anda tidak membutuhkannya - abaikan saja dengan -- variabel garis bawah khusus "_" a, _, _, d = some_function()

Fungsi dapat mengambil sejumlah variabel argumen:

Dalam prototipe, jumlah variabel argumen ditulis sebagai fungsi elipsis sum(...) s = 0 untuk _, n berpasangan(arg) do -- dalam fungsi, mereka disebut sebagai tabel "arg" s = s + n end mengembalikan jumlah akhir(1, 2, 3) -- akan mengembalikan 6 jumlah(1, 2, 3, 4) -- akan mengembalikan 10

Karena fungsi adalah tipe data lengkap, Anda dapat membuat variabel fungsi, atau Anda dapat meneruskan fungsi sebagai argumen ke fungsi lain

A = function(x) return x * 2 end -- fungsi yang dikalikan dengan 2 b = function(x) return x + 1 end -- fungsi yang bertambah 1 fungsi apply(table, f) result = () untuk k, v berpasangan(tabel) lakukan hasil[k] = f(v) -- ganti elemen dengan beberapa fungsi akhir elemen ini -- BERPIKIR: apa yang disebut t = (1, 3, 5) apply(t, a) terapkan (t, b)

Objek = fungsi + tabel

Karena kita dapat menyimpan fungsi dalam variabel, kita juga dapat menyimpannya dalam bidang tabel. Dan itu sudah menjadi metode seolah-olah. Bagi mereka yang tidak akrab dengan OOP, saya akan mengatakan bahwa manfaat utamanya (setidaknya di Lua) adalah bahwa fungsi dan data yang mereka kerjakan berada di dekatnya - dalam objek yang sama. Bagi mereka yang akrab dengan OOP, saya akan mengatakan bahwa tidak ada kelas di sini, dan pewarisan prototipe.

Mari kita beralih ke contoh. Kami memiliki objek, katakanlah bola lampu. Dia tahu cara membakar dan tidak membakar. Nah, ada dua tindakan yang dapat Anda lakukan dengannya - nyalakan dan matikan:

Lamp = ( on = false ) function turn_on(l) l.on = true end function turn_off(l) l.on = false end -- ini hanya fungsi untuk bekerja dengan struktur turn_on(lamp) turn_off(lamp)

Dan jika bola lampu dijadikan objek, dan fungsi turn_off dan turn_on dijadikan bidang objek, maka kita peroleh:

Lamp = ( on = false turn_on = function(l) l.on = true end turn_off = function(l) l.on = false end ) lamp.turn_on(lamp) lamp.turn_off(lamp)

Kami terpaksa melewatkan objek bola lampu itu sendiri sebagai argumen pertama, karena jika tidak, fungsi kami tidak akan tahu bola lampu mana yang harus digunakan untuk mengubah keadaan hidup / mati. Namun agar tidak bertele-tele, Lua memiliki singkatan yang biasa digunakan - lamp:turn_on(). Secara total, kita sudah mengetahui beberapa penyederhanaan sintaks seperti itu:

lamp:turn_on() -- notasi yang paling umum lamp.turn_on(lamp) -- ini juga benar dari sudut pandang sintaks lamp["turn_on"](lamp) -- dan ini

Melanjutkan berbicara tentang singkatan, fungsi dapat dijelaskan tidak hanya secara eksplisit, sebagai bidang struktur, tetapi juga dalam bentuk yang lebih nyaman:

Lamp = ( on = false ) -- melalui titik, maka argumen harus ditentukan fungsi lamp.turn_on(l) l.on = true end -- melalui titik dua, maka argumen secara implisit ditetapkan sendiri, sebagai variabel "self " -- "self" - dan ada bola lampu yang metode function lamp:turn_off() disebut self.on = false end

Menarik?

Fitur spesial

Beberapa nama fungsi tabel (metode) dicadangkan dan memiliki arti khusus:

* __add(a, b), __sub(a, b), __div(a, b), __mul(a, b), __mod(a, b), __pow(a, b) - dipanggil ketika operasi aritmatika dilakukan di atas meja
* __unm(a) - operasi unary "minus" (ketika mereka menulis sesuatu seperti "x = -x")
* __lt(a, b), __le(a, b), __eq(a, b) - hitung hasil perbandingan (<, <=, ==)
* __len(a) - dipanggil ketika "#a" selesai
* __concat(a, b) - memanggil "a..b"
* __call(a, …) — dipanggil pada "a()". Argumen variabel adalah argumen saat dipanggil
* __index(a, i) - akses ke a[i], asalkan elemen seperti itu tidak ada
* __newindex(a, i, v) - buat "a[i] = v"
* __gc(a) - ketika sebuah objek dihapus oleh pengumpulan sampah

Dengan mengesampingkan metode ini, Anda dapat membebani operator dan menggunakan sintaks bahasa untuk tujuan Anda sendiri. Hal utama adalah jangan berlebihan.

Warisan

Bagi mereka yang tidak tahu OOP, warisan memungkinkan Anda untuk memperluas fungsionalitas kelas yang sudah ada. Misalnya, hanya bola lampu yang bisa menyala dan mati, dan bola lampu super juga akan mengubah kecerahannya. Mengapa kita perlu menulis ulang metode turn_on/turn_off ketika kita dapat menggunakannya kembali?

Di Lua, ada konsep tabel meta untuk ini, yaitu. meja leluhur. Setiap tabel memiliki satu tabel induk, dan tabel anak dapat melakukan semua yang dapat dilakukan oleh induk.

Katakanlah kita telah membuat objek meja lampu. Maka super-bulb akan terlihat seperti ini:

Superlamp = ( brightness = 100 ) -- tentukan setmetatable tabel induk (superlamp, lamp) -- dan metodenya sekarang tersedia superlamp:turn_on() superlamp:turn_off()

Ekstensi fungsionalitas

Banyak tipe memiliki tabel induk (baik, string dan tabel pasti, angka dan boolean, dan nil tidak memilikinya). Katakanlah kita ingin menambahkan semua string menggunakan operator "+", bukan ".." . Untuk melakukan ini, Anda perlu mengganti fungsi "+" (__add) untuk tabel induk dari semua baris:

S = getmetatable("") -- dapatkan tabel induk dari baris s.__add = function(s1, s2) return s1..s2 end -- ubah metode -- centang a = "hello" b = "world" print(a + b) -- tulis "helloworld"

Sebenarnya kita masih bisa mengganti fungsi print dengan "print = myfunction", dan masih banyak lagi hacky lainnya yang bisa dilakukan.

Lingkup

Variabel bersifat global atau lokal. Saat dibuat, semua variabel di Lua adalah global.

PIKIR: kenapa?

Untuk menentukan cakupan lokal, tulis kata kunci lokal:

Lokal x lokal var1, var2 = 5, 3

Jangan lupakan kata ini.

Pemrosesan kesalahan

Seringkali, jika terjadi kesalahan, perlu untuk menghentikan eksekusi fungsi tertentu. Anda tentu saja dapat melakukan banyak pemeriksaan dan memanggil "kembali" jika terjadi kesalahan. Tapi ini akan meningkatkan jumlah kode. Lua menggunakan sesuatu seperti pengecualian.

Kesalahan dihasilkan menggunakan fungsi error(x). Apa pun dapat diteruskan sebagai argumen (apa yang terkait dengan kesalahan - deskripsi string, kode numerik, objek yang menyebabkan kesalahan, dll.)

Biasanya setelah fungsi ini seluruh program macet. Dan ini tidak selalu diperlukan. Jika Anda memanggil fungsi yang mungkin menimbulkan kesalahan (atau fungsi turunannya mungkin menimbulkan kesalahan), maka panggil dengan aman dengan pcall():

Fungsi f(x, y) ... if ... then error("gagal melakukan sesuatu") end ... status akhir, err = pcall(f, x, y) -- f: function, x-y: its argumen jika bukan status maka -- tangani kesalahan err. Dalam kasus kami, err berisi akhir teks kesalahan

Perpustakaan Standar

Ada banyak perpustakaan non-standar, mereka dapat ditemukan di LuaForge, LuaRocks dan repositori lainnya.

Antara Lua dan non-Lua

Tetapi bagaimana jika fungsi perpustakaan standar tidak cukup bagi kita? Bagaimana jika kita memiliki program C dan kita ingin memanggil fungsinya dari Lua? Ada mekanisme yang sangat sederhana untuk ini.

Katakanlah kita ingin membuat fungsi kita sendiri yang mengembalikan angka acak (Lua memiliki math.random(), tetapi kita ingin belajar). Kita harus menulis kode C berikut:

#termasuk #termasuk #termasuk /* sebenarnya apa yang harus dilakukan saat memanggil `rand(from, to)` */ static int librand_rand(lua_State *L) ( int from, to; int x; from = lua_tonumber(L, 1); /* parameter fungsi pertama * / ke = lua_tonumber(L, 2); /* parameter fungsi kedua */ x = rand() % (ke - dari + 1) + dari; lua_pushnumber(L, x); /* nilai pengembalian */ pengembalian 1; / * mengembalikan hanya satu argumen */ ) /* di Lua "rand" sesuai dengan fungsi librand_rand() kami */ static const luaL_reg R = ( ("rand", librand_rand), (NULL, NULL) /* akhir daftar yang diekspor fungsi */ ); /* dipanggil saat perpustakaan dimuat */ LUALIB_API int luaopen_librand(lua_State *L) ( luaL_openlib(L, "librand", R, 0); srand(time(NULL)); return 1; /* success */ )

Itu. Lua memberi kita fungsi untuk bekerja dengan tipe data, untuk mengambil argumen fungsi dan mengembalikan hasil. Ada sangat sedikit fungsi, dan mereka cukup sederhana. Sekarang kita membangun perpustakaan kita sebagai dinamis dan kita dapat menggunakan fungsi Rand() :

Random = require("librand") -- muat library print(random.rand(1, 100)) print(random.rand(0, 1))

Bagaimana jika kita ingin memanggil kode Lua dari program kita? Kemudian program kita harus membuat mesin virtual Lua, di mana skrip Lua akan dieksekusi. Ini jauh lebih mudah:

#include "lua.h" #include "lauxlib.h" int main() ( lua_State *L = lua_open(); // buat mesin virtual Lua luaL_openlibs(L); // muat pustaka standar luaL_dofile(L, " rand. lua"); // jalankan skrip lua_close(L); // tutup Lua return 0; )

Semua.

Anda sekarang dapat menulis dalam Lua. Jika Anda menemukan poin menarik tentang Lua yang dapat tercermin dalam artikel - tulis!

Dalam rangkaian tutorial yang saya buat ini, bahasa pemrograman Lua akan dibahas. Saya akan mencoba membuat presentasi semudah mungkin untuk pemula, dan saya akan fokus pada mereka. Artinya, pembuat kode Lua yang berpengalaman, kemungkinan besar, tidak akan mempelajari sesuatu yang baru dari sini (saya yakin mereka hanya akan menemukan ruang untuk memilih dan berkomentar di sini, yang, pada kenyataannya, bahkan disambut oleh mereka), tetapi jika Anda tidak memiliki pengalaman pemrograman yang kaya di belakang Anda, maka saya pikir Anda akan mendapatkan sesuatu.

Seluruh seri tidak akan mematuhi sistem apa pun. Pelajaran secara berurutan akan memperkenalkan serangkaian konstruksi bahasa sehingga pada pelajaran ketiga atau keempat Anda sudah dapat menulis program Anda. Tujuan saya adalah mendorong Anda untuk mempelajari bahasa sendiri, untuk membantu Anda merasakannya, bukan menjelaskannya dari A hingga Z - jika Anda ingin menguasai bahasa sepenuhnya, baca panduan referensi (yang, meskipun buruk, diterjemahkan ke dalam bahasa Rusia: http://www.lua .ru/doc/). Semakin cepat Anda beralih dari tutorial "untuk boneka" di Web ke manual, semakin baik.

Jika ada yang kurang jelas, tanyakan di kolom komentar, saya dan peserta lain akan mencoba membantu Anda.

Lua adalah bahasa pemrograman yang populer, mudah dipelajari, tujuan umum, dapat disematkan, ditafsirkan, dan diketik secara dinamis. Tidak, Anda tidak perlu memahami bahkan setengah dari kata-kata dalam kalimat sebelumnya - yang utama adalah mengetahui bahwa itu populer dan tidak rumit. Omong-omong, kesederhanaan, serta ukuran distribusi yang kecil (sekitar 150 kilobyte), ia pantas mendapatkan popularitasnya. Skrip Lua didukung oleh berbagai aplikasi, termasuk game. World of Warcraft dan S.T.A.L.K.E.R. menggunakan bahasa Lua. Mesin permainan favorit saya memungkinkan Anda untuk dengan mudah membuat berbagai permainan dengan Lua. Seperti yang Anda lihat, Lua membuka banyak cakrawala untuk Anda!

Sebelum kita mulai, Anda harus menyiapkan lingkungan pemrograman: yaitu, temukan program yang mengambil kode Lua yang Anda tulis dan jalankan: seorang juru bahasa. Ada tiga opsi di sini:

1. Unduh distribusi Lua resmi dari salah satu situs yang menyediakannya.

Dari situs web resmi Lua, Anda hanya dapat mengunduh kode sumber penerjemah. Namun, jika Anda melihat http://lua.org/download.html di bagian Binaries, Anda mungkin menemukan tautan ke situs dengan Windows yang dapat dijalankan. Salah satu diantara mereka: . Unduh salah satu arsip dari sana (cocok dengan platform Anda: Win32 atau Win64) dan ekstrak di suatu tempat, sebaiknya di direktori dengan jalur pendek: seperti C:\lua. Mulai sekarang, saya akan berasumsi bahwa Anda menggunakan Windows, dan juru bahasa Anda berada di sana.

Pengguna sistem operasi berbasis Linux lebih mudah dalam hal ini: mereka hanya perlu menggunakan manajer paket dan menginstal Lua dari repositori. Di Debian dan Ubuntu, ini dilakukan dengan apt-get install lua, dan di Fedora, Red Hat, dan turunannya, yum install lua. Namun, jangan percaya saya secara membabi buta dan lihat manual sistem operasi Anda untuk mengetahui dengan tepat bagaimana hal itu dilakukan untuk Anda.

2. Gunakan juru bahasa online.

Terletak di http://www.lua.org/demo.html . Awalnya mungkin cukup, tetapi di masa depan, ketika kami menyentuh modul, Anda akan dipaksa untuk menggunakan versi offline. Menggunakan penerjemah online sangat sederhana: masukkan program Anda di kotak teks dan klik tombol Jalankan. Program akan dijalankan, output program Anda akan muncul di jendela Output, serta laporan kesalahan, jika ada, dibuat oleh Anda.

3. Gunakan IDE.

Misalnya ZeroBrane Studio: http://studio.zerobrane.com/ . Ada yang lain - lihat online.

Dua versi Lua yang sedikit berbeda saat ini sedang digunakan: 5.1 dan 5.2. Saya akan fokus pada versi terbaru - versi 5.2, tetapi pastikan untuk menunjukkan perbedaan penting antara itu dan 5.1, karena yang terakhir juga cukup umum. Omong-omong, Lua 5.1 mengeksekusi kode satu setengah kali lebih cepat daripada Lua 5.2, asal Anda tahu.

=== Pelajaran #1 ===

Jadi, mari kita mulai. Buat file main.lua dalam folder yang diisolasi dari file asing dan tulis ke dalamnya:

200?"200px":""+(this.scrollHeight+5)+"px");">
-- main.lua --
print("Halo dunia!")

Kemudian jalankan pada baris perintah (jangan lupa pindah ke direktori dengan main.lua menggunakan perintah cd):

200?"200px":""+(this.scrollHeight+5)+"px");">
> C:\lua\lua.exe main.lua

Sebagai tanggapan, juru bahasa Lua akan mengeluarkan:

200?"200px":""+(this.scrollHeight+5)+"px");">
Halo Dunia!

Pada dasarnya, ini yang diharapkan. Dalam program, kami memanggil fungsi cetak. Fungsi cetak mengambil sejumlah parameter dan mencetaknya secara berurutan ke layar. PADA contoh ini kami memberikannya string (string karakter) "Halo dunia!". Dengan kesuksesan yang sama, Anda dapat meneruskan sebagai parameter:

200?"200px":""+(this.scrollHeight+5)+"px");">
print(8) -- beberapa angka desimal
-- keluaran: 8

Cetak(0xDEADBEEF) -- bilangan heksadesimal
-- keluaran: 3735928559

Print("0xDEADBEEF") -- dan ini adalah string, bukan angka! Lihat kutipannya?
-- cetakan: 0xDEADBEEF

Print(1.35e-4) -- bilangan floating point (pecahan)
-- Keluaran 0,000135. 1.35e-4 harus dipahami sebagai "1,35 kali
- sepuluh pangkat empat minus", jika ada yang tidak tahu.

Cetak((198*99)-3*500 + 14/88) -- ekspresi
-- Menampilkan nilai ekspresi: 18102.159090909. Bukan alternatif yang buruk
-- kalkulator desktop!

Cetak(198/7, "pupuk", 2^9) -- beberapa parameter arbitrer
-- Tipe. Nilai masing-masing akan ditampilkan, dipisahkan oleh tanda.
-- tab:
-- 28.285714285714 pupuk 512
-- Perhatikan bahwa kutipan seputar pupuk tidak dicetak!

Cetak(1.35) -- dua angka, bukan desimal 1.35!
-- Koma digunakan untuk memisahkan opsi.
-- Keluaran:
-- 1 35

Tanda "--" bukan hanya tiruan tanda hubung, yang disisipkan untuk kecantikan. Tanda "--" di Lua menandai komentar: petunjuk untuk programmer yang diabaikan oleh interpreter dan dimaksudkan untuk membuat kode lebih mudah dipahami. Anda dapat mencoba menulis dalam program:

200?"200px":""+(this.scrollHeight+5)+"px");">
--print("tidak ada")

Penerjemah akan menganggapnya sebagai komentar dan tidak akan menjalankan instruksi.

Catatan untuk nyonya rumah: jika Anda ingin mencetak hanya satu baris, Anda dapat menulis panggilan cetak seperti ini, tanpa tanda kurung:

200?"200px":""+(this.scrollHeight+5)+"px");">
print "Hanya satu string"

Kenyamanan tentu dipertanyakan: perlu diingat bahwa ini mungkin. Namun, panggilan semacam itu tidak diperbolehkan:

200?"200px":""+(this.scrollHeight+5)+"px");">
print 2 tidak akan berfungsi, 2 bukan string.
cetak 2*2 + 6 -- lebih dari itu tidak akan berhasil

Str = "tali!!" -- atur variabel str menjadi "string!!"
-- baca tentang variabel di bawah
print str -- juga tidak akan berfungsi.

Dalam setiap kasus di atas, program hanya akan menolak untuk bekerja. Jadi, dalam panggilan "bebas tanda kurung", hanya string literal (yaitu, urutan karakter yang diapit tanda kutip) yang dapat mengikuti nama fungsi, dan tidak ada yang lain. Di masa depan, saya akan berbicara tentang fitur ini sedikit lebih detail, tetapi untuk saat ini, itu sudah cukup untuk Anda.

Dalam bahasa pemrograman yang baik, dimungkinkan untuk mendeklarasikan variabel: wadah kecil yang dapat berisi beberapa jenis data. Di Lua ini dilakukan seperti ini:

200?"200px":""+(this.scrollHeight+5)+"px");">
<имя_переменной> = <выражение>

Sebagai contoh:

200?"200px":""+(this.scrollHeight+5)+"px");">
bintang = 8 -- Variabel bintang sekarang menyimpan angka 8
wars = "owl" -- Dalam variabel wars, string "owl"
jedi = 42/2 -- Variabel jedi adalah angka 21
luke = star*jedi -- Variabel luke adalah angka 168 (ya, 21 kali 8)

Nilai variabel dan ekspresi dengannya juga dapat ditampilkan di layar:

200?"200px":""+(this.scrollHeight+5)+"px");">
cetak (bintang, perang, jedi, bintang jedi + luke)
-- Keluaran:
-- 8 burung hantu 21 181

Hanya saja, jangan mencoba menambahkan variabel bintang dan perang - mencoba menambahkan 8 ke "burung hantu" tidak akan ada gunanya bagi Anda!

Seperti yang seharusnya Anda perhatikan, nama variabel bisa berupa apa saja: yang utama adalah tidak dimulai dengan angka. Serius, Anda bahkan dapat mendeklarasikan variabel yang disebut print dan kemudian fungsi print akan berhenti bekerja karena nama print akan merujuk ke variabel yang baru dideklarasikan. Tetapi ada sekelompok kata yang dilarang untuk digunakan sebagai nama variabel - ini adalah kata kunci bahasa yang belum kita temui, tetapi yang pasti layak untuk dilihat:

200?"200px":""+(this.scrollHeight+5)+"px");">
dan istirahat lakukan yang lain jika berakhir
false untuk fungsi goto if in
lokal nihil tidak atau ulangi kembali
maka benar sampai sementara

Dengan membuat variabel dengan salah satu nama ini, Anda akan menyebabkan kesalahan dalam program, dan itu pasti tidak akan berfungsi. Perhatikan bahwa dalam Lua 5.1 tidak ada kata kunci goto, dan Anda dapat memanggil variabel itu, tetapi Anda sebaiknya tidak melakukannya.
Perhatikan juga bahwa nama variabel peka huruf besar/kecil. Ini berarti bahwa foo, foo, fOO, dan FOO adalah empat variabel yang berbeda, jadi jika Anda menulis nama variabel dalam huruf kecil dan kemudian menulisnya dalam huruf besar, kemungkinan besar program tidak akan bekerja dengan benar.

Dan sekarang satu poin penting: apa yang terjadi jika Anda, secara tidak sengaja atau sengaja, merujuk ke variabel yang tidak ada? Dalam kebanyakan bahasa lain ini akan menimbulkan kesalahan, tetapi di Lua situasi ini dapat diterima. Itu diperlakukan seolah-olah variabel yang tidak ada benar-benar ada, tetapi nilainya adalah nol. nol- ingat kata ini! adalah jenis nilai khusus dalam Lua yang berarti "tidak ada". Bukan nol dan bukan string kosong (string seperti "" - coba tampilkan di layar), tetapi tidak ada apa-apa. Bandingkan dengan model ini: ada dua orang, salah satunya memiliki rekening bank, tetapi tidak memiliki uang, dan yang lainnya tidak memiliki rekening bank sama sekali. Dalam hal Lua, akan dianggap bahwa akun yang pertama memiliki 0 dolar, dan akun yang kedua memiliki nol. Dan bahkan bukan dolar, tapi cukup nol. Saya harap saya tidak membingungkan Anda.

Coba, misalnya, jalankan program berikut:

200?"200px":""+(this.scrollHeight+5)+"px");">
-- main.lua --
foo = "bar"
cetak (foo, baz)
-- Keluaran:
-- bar nihil

Jadi, variabel baz, yang tidak ada tetapi dianggap ada, memiliki nilai nil, dan fungsi print memahami ini dan mencetaknya ke layar sebagai string "nil". Lua memiliki metode yang bagus untuk memeriksa keberadaan sebuah variabel: jika nilai dari sebuah variabel tidak nil, maka setidaknya dideklarasikan. Di sisi lain, Anda dapat secara eksplisit mendeklarasikan variabel yang sama dengan nil:

200?"200px":""+(this.scrollHeight+5)+"px");">
cool_var = nihil

Ini bisa dilakukan, dan meskipun tampak konyol pada pandangan pertama, ini terkadang dilakukan. Dalam pelajaran berikutnya, Anda akan mempelajari siapa dan mengapa, dan Anda mungkin akan mulai melakukan hal yang sama. Kadang-kadang, tentu saja.
Hati-hati dengan nil ": Anda dapat mencetak nil, tetapi Anda tidak dapat melakukan aritmatika dengan itu! Artinya, jika print (nil) lolos, maka konstruksi seperti 99 + nil akan menyebabkan kesalahan, bahkan jika Anda melakukannya seperti 99+ nil adalah 99. Percayalah, saya juga kesal saat mengetahuinya.

Ringkasan:
1. Kami belajar tentang fungsi print, apa yang dapat dilakukannya dan bagaimana memanggilnya dengan benar tanpa tanda kurung.
2. Kita belajar bagaimana mendeklarasikan variabel, bagaimana mengevaluasi ekspresi (walaupun sedikit), nama apa yang dimiliki variabel.
3. Kami belajar tentang nihil, dijiwai dengan misteri mistiknya dan memperoleh keyakinan bahwa di masa depan kami akan terhubung dengannya.

Bagi mereka yang ingin tahu dan ingin memperkuat pengetahuan mereka, saya menawarkan latihan sederhana, yang dapat dihilangkan jika Anda merasa sudah cukup kompeten:
1. Tulis program yang mencetak chorus dari lagu favorit Anda.
2. Coba tampilkan nilai dari ekspresi berikut. Cobalah untuk memahami mengapa beberapa dari mereka bekerja dan beberapa tidak. Lihat kesalahan apa yang disebabkan oleh ekspresi yang rusak.

200?"200px":""+(this.scrollHeight+5)+"px");">
2 + "tali";
6 + "14";
"kotak" - "vox";
1 * "11b"
"148" * "1e6";


3. Tulis program yang menukar dua nilai variabel. Itu adalah:

200?"200px":""+(this.scrollHeight+5)+"px");">
a = 6502
b=8086


Buat a sama dengan 8086 dan b sama dengan 6502. Untuk melakukannya, buat variabel ketiga dan buat permutasi sederhana. Pastikan masalah diselesaikan dengan benar dengan memanggil print(a,b) sebelum pertukaran dan print(a,b) sesudahnya.

Halo semua.

Hari ini kita akan melihat sekilas bahasa Lua, beberapa fiturnya, dan menjalankan skrip kita di RakBot.
Lua adalah bahasa pemrograman scripting yang dirancang untuk pemrosesan data yang cepat. Dengan bantuan bahasa ini, banyak pengembang membuat kecerdasan buatan dalam game, menulis algoritma pembuatan level, dan juga digunakan untuk mengembangkan sumber daya / mod game di Multi Theft Auto: San Andreas (mirip dengan SA: MP). Faktanya, ini adalah bahasa yang paling sederhana dan dengan bantuan itu kita akan belajar bagaimana menulis logika kita sendiri untuk bot yang akan digunakan RakBot.

Mari kita membahas dasar-dasar pemrograman yang harus kita kerjakan.

catatan : Artikel ini akan dipotong dari segi bahasa Lua, karena RakBot hanya menggunakan sebagian kecil saja. Banyak fitur Lua yang tidak tersedia di RakBot, jadi saya akan fokus pada versi dari RakBot.

Ada tradisi di antara semua penulis buku dan dokumentasi dalam berbagai bahasa bahwa ini adalah program pertama yang mencetak "Hello World".
Nah, mari kita coba menulisnya, tetapi di RakBot. Kami pergi ke situs web RakBot resmi dan mencari bagian "Fungsi yang tersedia", bagian "Acara".

Kami membutuhkan sebuah acara onScriptStart(), yang dipanggil secara otomatis saat skrip dimuat oleh RakBot itu sendiri.

Dalam fungsi ini, kita perlu menjelaskan logika yang akan menulis RakBot "a "Hello World" ke log obrolan. Untuk melakukannya, pada halaman yang sama di dokumentasi, lihat bagian "Fungsi".

Fungsi pertama printLog(teks)- itulah yang kita butuhkan. Dengan fungsi ini, kami akan mengirim pesan ke obrolan RakBot. Untuk melakukan ini, kami akan menulis:

Kami telah menulis logika dalam beberapa dokumen teks, tetapi bagaimana kami memberi tahu RakBot untuk mengeksekusi skrip kami? Untuk melakukan ini, Anda perlu menyimpan file dengan ekstensi .lua dan masukkan ke dalam folder skrip, di folder RakBot.
Saya menyimpan dokumen teks bernama " contoh.lua ". Mari kita coba menjalankan RakBot dan lihat apa yang kita dapatkan.

Seperti yang kita lihat, ketika memulai RakBot, ia menemukan skrip " contoh.lua", dan kemudian mengeksekusinya. Dari sini kita dapat menyimpulkan bahwa skrip diinisialisasi ketika RakBot sendiri diluncurkan atau ketika semua skrip dimuat ulang dengan perintah !reloadscripts.

Selamat, Anda baru saja menulis naskah sendiri untuk RakBot!

Kami telah mempelajari cara menulis Hello World di konsol RakBot, tetapi kami ingin menulis bot kompleks yang akan melakukan semua pekerjaan untuk kami, dengan kondisi tertentu. Kami akan berhenti di situ.
Hampir semua yang terjadi dalam pemrograman dapat digambarkan sebagai berikut: mengambil data, melakukan sesuatu dengannya, mengembalikan hasilnya.
Dalam hal ini, RakBot sendiri adalah datanya. Itu meluncurkan skrip kami dengan sendirinya, dan juga mengirimi kami data yang dapat kami proses sesuai keinginan dan mendapatkan hasilnya pada akhirnya.

Mari kita menulis skenario sederhana dengan kondisi. Kondisi tersebut akan menjadi nickname dari bot tersebut. Jika nickname bot adalah "CMaster", maka kami akan menampilkan "CM FOREVER" di chat RakBot, jika nickname bot sama sekali berbeda, kami akan menampilkan "Nonamer" di chat.
Untuk melakukan ini, kita dapat menggunakan operator kondisi if else, juga dikenal sebagai operator cabang. Dibutuhkan kondisi yang harus mengembalikan true atau false . Jika kondisi benar maka kode di dalamnya akan dieksekusi, jika salah tidak akan dieksekusi.
Inilah yang menjadi dasar sebagian besar logika aplikasi apa pun. Secara harfiah, jika diterjemahkan sebagai "JIKA", maka - "BERARTI", yang lain - "LAINNYA" Jika sangat sulit - jangan khawatir, Anda akan memahami semuanya lebih lanjut.

Lua memiliki operator perbandingan berikut:
> Lainnya
< Меньше
>= Lebih dari atau sama dengan
<= Меньше или равно
~= Tidak sama
== Sama dengan

Jika kita menulis " CMaster" == "cm"- kita akan memiliki nilai False , yaitu false
Jika kita menulis " CMaster" == "CMaster"- kita akan memiliki nilai True , yaitu true.

5 > 10 -- salah 5< 10 -- истина 10 ~= 15 -- истина 10 >= 5 -- benar

Mari kita coba menggunakan logika percabangan dalam skenario kita sebelumnya.

Kode yang kami tulis sebelumnya:

Fungsi onScriptStart() printLog("Halo dunia!"); akhir

Mari kita ubah sebagai berikut:

Fungsi onScriptStart() botName = getNickName() if(botName == "CMaster") lalu printLog("CM FOREVER"); else printLog("Nonamer"); akhir akhir

Mari kita uraikan kode ini mulai dari atas. Saya menyarankan Anda untuk mulai belajar membaca kode segera. Jadi mari kita coba membaca apa yang kita dapatkan

Fungsi onScriptStart() - buat fungsi bernama onScriptStart botName = getNickName() - tulis nama bot ke variabel botName if(botName == "CMaster") lalu - jika nama bot sama dengan "CMaster", maka printLog(" CM SELAMANYA"); - tulis ke obrolan "CM Selamanya". else- ELSE, atau jika nama bot TIDAK SAMA DENGAN "CMaster" printLog("Nonamer"); - tulis di obrolan "Nonamer" akhir kondisi akhir akhir fungsi

Mari kita coba untuk menguji kode yang telah kita tulis. Saya menyimpan kode yang dimodifikasi dengan cara yang sama di bawah nama " contoh.lua "dan meluncurkan RakBot dengan nama panggilan" Mason_Bennett".

Setelah mengunggah skrip kami, RakBot mengobrol dengan Nonamer. Mari kita coba masuk dengan nama panggilan " CMaster".

Seperti yang kita lihat, kondisi kita bekerja dengan sukses dan kita melihat apa yang kita inginkan dalam obrolan.

Mari kita pergi melalui variabel sedikit. Anda memiliki selembar kertas dan Anda ingin menyimpannya. Simpan dengan cara tertentu - tempat untuk meletakkannya agar tidak hilang. Misalnya, kita bisa meletakkan kertas kita di loker dan mengeluarkannya saat kita membutuhkannya. Jika kita memiliki lembaran baru dan kita tidak membutuhkan yang lama, kita akan membuang lembaran lama dan memasukkan yang baru.
Ini adalah logika variabel. Kita dapat membuat variabel dengan nama yang kita inginkan dan menulis nilai pada variabel tersebut, seperti yang kita lakukan pada contoh sebelumnya dengan variabel botName.

Di Lua, kita bisa menulis apapun yang kita inginkan ke sebuah variabel. Sebagai contoh, saya ingin membuat sebuah variabel bernama PaperList dan menulis teks "Lua - Lesson #2" ke dalamnya. Untuk ini saya akan menulis:

PaperList = "Lua - Pelajaran #1"

Apa yang telah kita lakukan di sini? Saya menulis nama dan menggunakan operator penugasan "=" dan sekarang saya dapat menggunakan variabel ini di mana saja dalam skrip saya.
Saya pikir jika Anda mengingat matematika pada tingkat maksimal kelas 5, semuanya akan jelas di sini.

Lua memiliki beberapa tipe variabel, yaitu nil, boolean, number, string . Jangan takut, semuanya sangat sederhana.

Sebenarnya, ada beberapa lagi, tetapi saya sudah mengatakan bahwa RakBot tidak memiliki sebagian besar fungsi.

nihil - tidak ada nilai.
boolean - nilai logis, menerima dua varian nilai - benar atau salah.
nomor - bilangan real dengan presisi ganda. Lua tidak memiliki tipe integer, jadi ia bertindak sebagai tipe real dan integer.
string - string, di sini, saya pikir, semuanya jelas.
Nah, mari kita coba membuat beberapa variabel dan "bermain-main" dengannya.

angka = 0; - buat variabel yang disebut angka dan tetapkan nilai 0
angka = angka + 5; - memberikan nilai ke variabel nomor + 5 (yaitu, 0 + 5), sekarang kami memiliki nomor 5 yang disimpan di sini.
nomor++; - ++ - kenaikan. Dengan kata lain, Anda mengambil variabel dan meningkatkannya satu per satu. Artinya, (5 + 1) - sekarang kita memiliki 6 dalam variabel angka.
nomor --; - -- pengurangan. Dengan kata lain, kita berkurang satu unit. (6 - 1) - sekarang nilainya 5.

string = "Halo" - buat variabel string dengan nilai "Halo"
string = string .. "," - rangkaian string, juga dikenal sebagai penambahan string. Apa yang telah kita lakukan di sini? Tentukan nama variabel, tentukan operator rangkaian "..", lalu tentukan baris lain yang akan ditambahkan ke yang pertama. Sekarang kita memiliki nilai "Halo," dalam variabel "string".
tali = tali.. getNickName() - sekarang, untuk "Halo," kami telah menambahkan nama panggilan bot, biarkan menjadi "Michel". Sekarang kita memiliki nilai "Halo, Michel" dalam variabel string.

boolean = benar; - buat variabel boolean dengan nilai true (TRUE).
boolean = getNickName() == "Dimosha" - bandingkan nama bot dengan string Dimosha. Karena nama bot yang kita miliki adalah Michel, dari contoh sebelumnya, nilai false (FALSE) akan ditulis di sini.

Sedikit tentang fungsi. Ada fungsi yang mengembalikan nilai, dan ada yang tidak mengembalikan nilai. Seperti yang Anda lihat, fungsi kami onScriptStart tidak mengembalikan nilai, tetapi hanya mengeksekusi kode yang ditentukan di dalamnya.
Kita dapat membuat fungsi kita sendiri untuk mengisolasi bagian logika dari metode dan melakukan operasi tertentu.
Fungsi mungkin atau mungkin tidak mengambil nilai.

Mari kita lihat cara paling sederhana: fungsi tanpa parameter dan tanpa nilai balik, yang akan menambahkan 5 + 10 dan menampilkan hasilnya ke konsol RakBot.

Saya akan membuat fungsi bernama Add :

Fungsi Tambah() -- Buat fungsi Tambah printLog(5 + 10) -- gunakan metode RakBot untuk mencetak ke konsol akhir-- Akhir fungsi

Kami membuat fungsi yang tidak terlalu universal karena dua alasan:
- jika saya perlu menambahkan nomor lain - Saya harus membuat nomor lain dengan fungsi yang sama
- Saya tidak dapat menggunakan nilai yang diterima di luar fungsi

Mari kita coba perbaiki kekurangan pertama. Untuk melakukan ini, kami akan menambahkan dua parameter ke fungsi, yang akan mengambil angka untuk penambahan. Kami akan melakukannya dengan cara berikut:

Fungsi Tambah(a, b) printLog(5 + 10) akhir

Sekarang kami memiliki dua nilai yang tersedia dalam metode, yang terkandung dalam dua variabel baru a dan b, tetapi saya masih mendapatkan 15 di konsol. Mari kita perbaiki ini:

Fungsi Tambah(a, b) printLog(a + b) akhir

Sempurna. Sekarang, saat memanggil metode ini, kami akan menerima hasil penambahan di konsol. Mari kita coba untuk menguji. Mari kita ubah kode kita menjadi contoh.lua ke yang berikutnya:

Fungsi Tambah(a, b) printLog(a + b) fungsi akhir onScriptStart() Tambah(5, 10); Tambahkan(123, 4324); Tambahkan(555, 111); akhir

Dan mari kita coba menjalankan RakBot. Mari kita lihat apa yang terjadi dari ini:

Ini memecahkan masalah pertama kami. Mari kita coba selesaikan yang kedua agar fungsi kita mengembalikan hasilnya.

Mari kita tulis ulang fungsi Add:

Fungsi Tambah(a, b) mengembalikan a + b akhir

return adalah kata kunci untuk mengembalikan nilai dari suatu fungsi. Mari kita tulis ulang metode onScriptStart sekarang:

Fungsi onScriptStart() printLog("Nilai pertama: "..Add(5, 10)); printLog("Nilai kedua: "..Tambah(123, 4324)); printLog("Nilai ketiga: "..Tambah(555, 111)); akhir

Mari kita lihat apa yang terjadi.

Kami dapat membuat tiga variabel dengan menetapkan nilai dari fungsi Menambahkan dan kemudian meneruskannya ke metode cetakLog, tetapi saya tidak melakukannya karena kodenya terlihat lebih mudah dibaca dan lebih bagus.

Sekarang, kita telah belajar cara membuat fungsi kita sendiri dengan parameter, tanpa parameter, dan mengembalikan nilai darinya. Saya percaya bahwa dasar-dasar ini akan cukup bagi Anda untuk menulis bot Anda sendiri di RakBot "a. Dalam pelajaran berikut, kami akan membuat bot paling sederhana, yang secara bertahap akan kami perumit, menambahkan lebih banyak fitur dan fungsi baru.