Pengaturcaraan Lua/Ungkapan

Daripada Wikibooks
Jump to navigation Jump to search

Seperti yang diterangkan sebelum ini, ungkapan merupakan cebisan-cebisan kod yang memiliki nilai dan dapat dinilai (evaluate). Fungsi tidak dapat dilaksanakan secara langsung (melainkan panggilan fungsi), dan oleh sebab itu, sebuah skrip yang hanya mengandungi kod berikut (sebuah ungkapan) akan menimbulkan ralat.

3 + 5
-- Kod di atas menimbulkan ralat oleh sebab ia hanya mengandungi sebuah ungkapan.
-- Komputer tidak dapat melaksanakan '3 + 5' kerana itu tidak munasabah.

Kod perlu terdiri daripada jujukan penyataan. Penyataan-penyataan ini boleh mengandungi ungkapan yang akan menjadi nilai yang harus dimanipulasi ataupun digunakan oleh penyataan untuk melaksanakan perintah.

Beberapa contoh kod dalam bab ini tidak mengandungi kod sah oleh sebab kod-kod tersebut hanya terdiri daripada ungkapan. Dalam bab berikutnya, kita akan membincangkan penyataan dan kita akan dapat mula menulis kod yang sah.

Jenis data (Data type)[sunting]

Apabila kita menilai ungkapan, kita sebenarnya menghitung ungkapan itu untuk mendapatkan nilainya. Hal ini benar dalam bidang-bidang matematik dan sains komputer; kedua-duanya mengandungi ungkapan. Malah, satu perbezaan utama antara matematik dan sains komputer ialah, bahasa pengaturcaraan mengandungi ungkapan dan pernyataan, sementara matematik hanya mempunyai ungkapan. Apabila ungkapan dinilai, ia perlu dinilai untuk mendapatkan nilai. Nilai kadangkalanya terdiri daripada nombor, teks dan juga jenis-jenis data lain; itulah sebabnya nilai dikatakan "memiliki jenis".

Dengan Lua, dan pengaturcaraan amnya, ungkapan lazimnya terdiri daripada satu atau lebih nilai bersama-sama sifar atau lebih operator. Beberapa operator hanya dapat digunakan dengan jenis data tertentu (tak logik misalnya, untuk membahagikan teks sementara membahagikan nombor adalah munasabah). Terdapat dua jenis operator: operator sesatu (unary) dan operator dedua (binary). Operator sesatu merupakan operator yang hanya mengambil satu nilai. Misalnya, operator sesatu (-) hanya mengambil satu nombor sebagai parameter: -5, -3, -6, dsb. Ia mengambil satu nombor atau nilai sebagai parameter dan menjadikan nombor itu negatif. Sebaliknya, operator dedua, yang bukan merupakan operator yang sama, mengambil dua nilai dan menolak nilai kedua daripada yang pertama: 5 - 3, 8 - 6, 4 - 9, dsb.

Kita boleh mendapatkan jenis nombor sebagai sebuah rentetan (string) dengan fungsi type:

print(type(32425)) --> number

Nombor[sunting]

Nombor lazimnya mewakili kuantiti, akan tetapi juga dapat digunakan untuk perkara-perkara lain. Dengan Lua, jenis nombor lazimnya bekerja seperti nombor nyata (real number). Nombor dapat dibina sebagai integer, nombor perpuluhan, eksponen perpuluhan dan juga dalam bentuk perenambelasan (hexadecimal). Berikut ialah nombor-nombor sah:

  • 3
  • 3.0
  • 3.1416
  • 314.16e-2
  • 0.31416E1
  • 0xff
  • 0x56

Operasi aritmetik[sunting]

Oerator-operator nombor dalam Lua adalah seperti berikut:

Operasi Sintaks Pemerian Contoh
Penafian aritmetik -a Menukar tanda a dan memulangkan nilai -3.14159
Penambahan a + b Memulangkan nilai a campur b 5.2 + 3.6
Penolakan a - b Menolak nilai b daripada a dan memulangkan hasil 6.7 - 1.2
Pendaraban a * b Memulangkan hasil pendaraban a dengan b 3.2 * 1.5
Pengeksponenan a ^ b Memulangkan a yang dikuasakan dengan b, atau pengeksponenan a oleh b 5 ^ 2
Pembahagian a / b Membahagikan a dengan b dan memulangkan hasil 6.4 / 2
Operasi modulo a % b Memulangkan baki pembahagian a dengan b 5 % 3

Anda mungkin sudah tahu semua operator ini (operator-operator ini sama dengan operator-operator asas matematik) melainkan operator yang terakhir. Operator terakhir dipanggil operator modulo, dan tugasnya hanya menghitung baki pembahagian satu nombor dengan nombor yang lain. Misalnya, 5 % 3, akan memulangkan 2 kerana 2 merupakan baki apabila 5 dibahagikan dengan 3. Operator modulo tidak dijumpa sekerap operator-operator lain akan tetapi ia boleh menjadi berguna dalam kes-kes tertentu.

Nil[sunting]

Nil ialah jenis data yang memiliki nilai nil. Ciri utama "nil" berlainan daripada nilai-nilai yang lain; ia lazimnya mewakili ketiadaan nilai yang berguna. Sesebuah fungsi akan memulangkan nil jika, sebagai contoh, fungsi itu tidak ada apa-apa nilai berguna yang perlu dipulangkan (kita akan membincangkan fungsi kemudian).

Boolean[sunting]

Nilai Boolean boleh terdiri sama ada daripada benar (true) ataupun palsu (false), dan bukan nilai lain. Nilai ini ditulis secara literal dalam Lua sebagai true atau false, yang merupakan kata kunci simpanan. Operator-operator berikut sering digunakan dengan nilai-nilai Boolean, akan tetapi boleh juga digunakan dengan apa jua jenis data:

Operasi Sintaks Pemerian
Penafian Boolean not a Jika a palsu atau nil, memulangkan true. Jika tidak, memulangkan false.
Konjungsi logik a and b Memulangkan argumen pertama jika palsu atau nil. Jika tidak, memulangkan argumen kedua.
Disjungsi logik a or b Memulangkan argumen pertama jika bukan palsu mahupun nil. Jika tidak, memulangkan argumen kedua.

Pada asasnya, operator not ("bukan") hanya menafikan nilai Boolean (yakni, membuatnya palsu (false) jika ia benar (true) dan membuatnya benar jika ia palsu), operator and ("dan") memulangkan benar jika kedua-dua argumen itu benar dan palsu jika tidak. Operator or ("atau") pula memulangkan benar jika salah satu argumennya benar, dan memulangkan palsu jika sebaliknya. Walau bagaimanapun, cara ini bukan cara pelaksanaan sebenar. Cara pelaksanaan sebenar adalah seperti yang ditunjukkan dalam jadual di atas. Dengan Lua, nilai-nilai false dan nil dianggap palsu (yakni false), sementara yang lain dianggap benar atau true. Justeru, jika anda melakukan taakulan logik, anda akan perhatikan bahawa definisi-definisi yang disampaikan dalam perenggan ini sama dengan jadual di atas, mahupun definisi-defini yang terkandung dalam jadual mungkin tidak akan sentiasa memulangkan nilai Boolean.

Rentetan[sunting]

Rentetan (string) merupakan jujukan aksara yang dapat digunakan untuk mewakili teks. Rentetan boleh ditulis dalam Lua dengan meletakkannya dalam tanda petikan berganda, tanda petikan dan tanda kurungan siku atau segi empat (perhatikan yang ulasan dan rentetan tidak ada kesamaan lain melainkan yang kedua-dua boleh dihadkan dengan menggunakan tanda kurungan siku; dalam kes ulasan, tanda kurungan itu perlu didahului oleh dua tanda sengkang).

Note P: Contoh-contoh berikut tiada dalam buku asal. Contoh menunjukkan perbezaan penggunaan tanda kurungan siku untuk pengehadan rentetan dan ulasan.
x = "hello"
print(x) --> hello
x = 'hello'
print(x) --> hello
x = [[hello]]
print(x) --> hello
--[[Ini ulasan
      dalam dua baris --]]

Rentetan yang tidak diletak dalam kurungan akan hanya sah pada satu baris sahaja. Oleh sebab ini, satu-satunya cara untuk membuat rentetan yang menjangkau lebih daripada satu baris adalah dengan menggunakan jujukan lepasan. Cara ini juga caranya untuk memuatkan tanda petikan atau tanda petikan berganda dalam kes-kes tertentu. Jujukan lepasan terdiri daripada dua perkara: aksara lepasan – dalam Lua aksara lepasan ini sentiasa dalam bentuk tanda garis condong belakang ('\'), – dan sebuah pengenal pasti yang menunjukkan aksara yang perlu dilepaskan.

Jujukan lepasan dalam Lua
Jujukan lepasan Pemerian
\n Baris baharu
\" Tanda petikan berganda
\' Tanda petikan (atau koma atas)
\\ Garis condong belakang
\t Tab mendatar
\### ### mesti berupa nombor antara 0 hingga 255. Hasilnya ialah aksara sepadan.

Jujukan lepasan digunakan apabila timbul masalah jika aksara diletakkan secara langsung dalam sesebuah rentetan. Misalnya, jika anda ada teks rentetan yang dikurung dengan tanda petikan berganda dan tanda petikan berganda perlu hadir dalam teks tersebut, anda perlu mengurung teks rentetan dengan menggunakan aksara berlainan ataupun dengan melepaskan tanda petikan berganda tersebut. Kita tidak perlu melepaskan aksara dalam rentetan yang dikurung dengan tanda kurungan segi empat. Semua aksara yang dibatasi tanda kurung segi empat tidak akan diubah atau dinilai. Aksara % juga digunakan dalam pola rentetan bagi melepaskan aksara khas atau aksara magis (magic characters), akan tetapi di sini istilah melepaskan digunakan dalam konteks berlainan.

Dengan Lua, rentetan memiliki nilai yang tak berubah (immutable). Kita tidak boleh menukar aksara yang terdapat dalam rentetan dan perlu membuat rentetan baharu yang mengandungi perubahan yang dikehendaki.

"Ini satu rentetan sah."

'Ini juga rentetan sah.'

"Ini \"rentetan sah 'yang mengandungi tanda petikan yang tidak dilepaskan, 
dan tanda petikan berganda yang dilepaskan."

[[
Ini baris rentetan yang dapat disambung 
pada lebih daripada satu baris

Rentetan ini boleh mengandungi tanda petikan, tanda petikan berganda, dan apa jua aksara
(-- termasuk ulasan).  Lua akan mengabaikan maksud semua (termasuk aksara lepasan)
sehingga tanda penutup ]]

"Ini rentetan sah yang mengandungi tab \t, tanda petikan berganda \" dan garis condong belakang \\"

"Ini "bukan rentetan sah kerana ia mengandungi tanda petikan berganda yang tidak dilepaskan."
Note P: Kita juga boleh katakan yang tanda pelepasan menyebabkan aksara selepasnya dimasukkan dalam rentetan tanpa mengambil kira apa jenis aksara itu


Untuk memudahkan pengekodan, jika sesuatu tanda kurungan segi empat diikuti terus oleh baris baharu, baris itu akan diabaikan, Justeru, rentetan-rentetan berikut setara:

[[Ini rentetan yang
bersambung pada beberapa baris.]]

[[
Ini rentetan yang
bersambung pada beberapa baris.]]


-- Oleh sebab tanda kurungan pembuka rentetan kedua diikuti terus oleh baris baharu, 
-- baris baharu tersebut diabaikan.

Kita boleh mendapatkan panjang rentetan dalam bentuk nombor dengan menggunakan operator panjang sesatu ('#'):

print(#("Ini rentetan")) --> 12

Penjeraitan[sunting]

Operator penjeraitan rentetan Lua dilambangkan dengan dua titik ('..'). Ini contoh penjeraitan yang menjeraitkan "mata" dan "hari" lalu mencetak hasil penjeraitan tersebut:

print("mata" .. "hari") --> matahari

Kod ini akan menjerait "mata" dan "hari" dan mencetak hasilnya.

Jenis-jenis lain[sunting]

Empat jenis asas buat Lua (nombor, boolean, nil dan rentetan) sudah diperikan dalam bahagian-bahagian di atas, akan tetapi masih terdapat empat jenis lagi: fungsi, jadual, data pengguna (userdata) dan bebenang (thread). Fungsi merupakan cebisan kod yang dapat dipanggil, menerima nilai dan memulangkan nilai. Jadual ialah struktur data yang dapat digunakan untuk memanipulasi data. Data pengguna digunakan secara dalaman oleh aplikasi-aplikasi di mana Lua dibenamkan untuk membenarkan Lua berhubung dengan program tersebut melalui objek-objek yang dikawal oleh program itu. Akhir sekali, bebenang digunakan oleh korutin, yang membolehkan pelaksanaan banyak fungsi secara serentak. Semua ini akan diperikan dengan lebih mendalam kemudian nanti, jadi buat masa ini anda hanya perlu ingat yang terdapat jenis data selain nombor, boolean dan sebagainya.

Literal atau harfiah[sunting]

Literal-literal merupakan notasi bagi mewakili nilai tetap dalam kod sumber. Dengan Lua semua nilai dapat diwakilkan sebagai literal melainkan bebenang dan data pengguna. String literals (literals that evaluate to strings), sebagai contoh, consist of the text that the string must represent enclosed into single quotes, double quotes or long brackets. Number literals, on the other hand, consist the number they represent expressed using decimal notation (ex: 12.43), scientific notation (ex: 3.1416e-2 and 0.31416E1) or hexadecimal notation (ex: 0xff).

Paksaan[sunting]

Paksaan (coercion) ialah proses penukaran nilai sesebuah jenis kepada jenis yang lain. Lua menyediakan paksaan automatik antara rentetan dan nombor. Apa jua operasi aritmetik yang dikenakan terhadap sesebuah rentetan akan menyebabkan percubaan untuk menukar nilai jenis rentetan kepada jenis nombor. Sebaliknya, apabila nombor digunakan pada tempat di mana rentetan dijangka, nombor akan ditukar kepada rentetan. Proses ini berlaku dengan operator-operator Lua dan fungsi lalai (yakni, fungsi yang disesiakan bersama-sama Lua).

print("122" + 1) --> 123
print("Nombor ialah  " .. 5 .. ".") --> Nombor ialah 5.

Paksaan penukaran nombor kepada rentetan dan rentetan kepada nombor juga dapat dilakukan secara insani dengan menggunakan fungsi-fungsi tostring ("kepada rentetan") dan tonumber ("kepada nombor"). Fungsi pertama menerima nombor sebagai argumen dan menukarnya menjadi rentetan, sementara yang kedua menerima rentetan dan menukarnya menjadi nombor.

Keutamaan operator[sunting]

Keutamaan operator dengan Lua bekerja seperti dalam matematik. Beberapa operator akan dinilai sebelum yang lain, dan tanda kurungan dapat digunakan untuk menukar urutan pelaksanaan operator. Keutamaan penilaian operator adalah seperti di bawah, bermula daripada keutamaan rendah hingga keutamaan tinggi. Beberapa operator belum dibincangkan lagi setakat ini dan akan dibincang kemudian.

  • Boolean "atau": or
  • Boolean "dan": and
  • Operator hubungan: <, >, <=, >=, ~=, ==
  • Penjeraitan: ..
  • Operator matematik tahap 1: +, -
  • Operator matematik tahap 2: *, /, %
  • Operator sesatu: not, #, - (di sini tanda '-' ialah '-' sesatu seperti -5, bukan 5 - 3)
  • Pengeksponenan: ^

Halaman berikut: Pernyataan | Halaman sebelum: Pengenalan

Rumah: Pengaturcaraan Lua