Pengaturcaraan Lua/Fungsi
Tindanan (stack) ialah sebuah senarai item yang dapat ditambah (push) atau ditarik keluar (pop), yang beroperasi atas prinsip terakhir-masuk-terdahulu-keluar (last-in-first-out, LIFO). Ini bermakna item yang ditambah terakhir sekali akan dikeluarkan terdahulu. Inilah sebabnya senarai-senarai sedemikian disebut tindanan: dalam sebuah tindanan, anda tidak dapat menarik keluar sebuah item tanpa menarik keluar item-item yang berada di atasnya terlebih dahulu. Justeru, semua operasi berlaku pada bahagian atas tindanan. Maksudnya, item 'A' berada di atas item lain ('item B') sekiranya 'A' ditambah selepas 'B', dan 'A' berada di bawah 'B' sekiranya ia ditambah dahulu daripada 'B'.
Fungsi (juga dipanggil subrutin, prosedur, rutin atau subprogram dalam bahasa-bahasa pengaturcaraan lain) ialah jujukan arahan yang melaksanakan tugas tertentu, dan dapat dipanggil dari tempat lain dalam sesuatu program apabila jujukan arahan itu perlu dilaksanakan. Fungsi juga dapat menerima nilai sebagai input dan memulangkan output selepas memanipulasi input ataupun melaksanakan tugas berlandaskan input tersebut. Fungsi boleh diberikan definisi [atau dicipta] di mana-mana tempat dalam program, termasuk dalam fungsi yang lain, dan juga boleh dipanggil dari mana-mana bahagian program yang dapat mencapai fungsi itu: seperti nombor dan rentetan, fungsi merupakan nilai dan oleh sebab itu boleh distor dalam pemboleh ubah dan juga memiliki kesemua ciri yang dikongsi pemboleh ubah. Ciri-ciri ini menjadikan fungsi amat berguna.
Oleh sebab sesuatu fungsi itu boleh dipanggil daripada fungsi-fungsi lain, pentafsir Lua (program yang membaca dan melaksanakan kod Lua) perlu mengetahui fungsi apa yang memanggil fungsi yang sedang dilaksanakannya agar apabila fungsi itu tamat (apabila tiada lagi kod yang perlu dilaksanakan), ia dapat memulangkan hasil fungsi yang betul. Ini dilakukan dengan tindanan yang dipanggil tindanan panggil (call stack): setiap item dalam tindanan panggil merupakan fungsi yang memanggil fungsi yang berada di atasnya dalam tindanan, sehinggalah item terakhir dalam tindanan yakni, fungsi yang sedang dilaksanakan. Apabila sesuatu fungsi itu tamat, pentafsir menggunakan operasi pop tindanan untuk membuang fungsi terakhir dalam senarai dan kemudian pulang kepada fungsi sebelumnya.
Terdapat dua jenis fungsi: fungsi yang terbina dalam Lua dan fungsi yang direka pengguna. Fungsi terbina (Built-in function) ialah fungsi yang disediakn Lua dan memuatkan fungsi-fungsi seperti cetak (print
) yang anda sudah kenal. Beberapa fungsi dapat dicapai secara langsung, seperti fungsi print
; yang lain, seperti math.random
yang memulangkan nombor rawak, perlu dicapai melalui penggunaan pustaka. Fungsi rekaan pengguna (user-defined function) merupakan fungsi yang ditetapkan atau diberi definisi oleh pengguna. Fungsi-fungsi rekaan pengguna diberi definisi menggunakan pembina fungsi:
local func = function(paramater_pertama, parameter_kedua, parameter_ketiga)
-- badan fungsi (badan sesebuah fungsi ialah kod yang terkandung di dalamnya)
end
Kod yang tercatat di atas mencipta sebuah fungsi yang memiliki tiga parameter dan menstor parameter-parameter tersebut dalam sebuah pemboleh ubah bernama func. Kod berikut mengandungi pemanis sintaks (syntactic sugar) (sintaks yang membuat kod lebih molek) yang melakukan perkara yang sama dengan kod di atas:
local function func(paramater_pertama, parameter_kedua, parameter_ketiga)
-- kod
end
P: Bahasa perintah Lua ialah bahasa Inggeris |
Dalam kedua-dua kes, kita boleh mengabaikan kata kunci local
untuk menstor fungsi dalam pemboleh ubah global. Parameter bekerja macam fungsi dan membolehkan fungsi untuk menerima nilai.
Parameter-parameter bekerja macam pemboleh ubah dan membenarkan fungsi untuk menerima nilai. Argumen-argumen dapat diberikan kepada fungsi apabila sesebuah fungsi itu dipanggil. Fungsi akan menerima argumen itu sebagai parameter. Parameter bertindak seolah-olah pemboleh ubah lokal yang ditakrifkan pada bahagian awal fungsi, dan akan diberi umpukan mengikut urutan dalam panggilan fungsi. Dalam contoh berikut, fungsi menambah dua nombor dan mencetak hasilnya. Justeru ia akan mencetak 5 apabila kod dilaksanakan.
local function tambah(number_pertama, nombor_kedua)
print(number_pertama, nombor_kedua)
end
tambah(2, 3)
Pada kebiasaannya, panggilan fungsi ditulis dalam bentuk nama(argumen)
. Walau bagaimanapun tanda kurungan boleh diabaikan jika terdapat hanya satu argumen, dan argumen itu pula merupakan jadual atau rentetan dan bukan merupakan rentetan (yakni ia dibina secara langsung dalam panggilan fungsi sebagai sebuah literal):
print "Helo, world!" -- satu argumen, rentetan tak literal
print {4, 5} -- satu argumen, jadual
Baris kedua kod dalam contoh kedua akan mencetak alamat memori jadual. Apabila menukar nilai kepada rentetan, seperti yang dilakukan fungsi print
secara automatik, jenis-jenis kompleks (fungsi, jadual, data pengguna dan bebenang) akan ditukarkan kepada alamat memori masing-masing. Nilai-nilai boolean, nombor, dan nil akan ditukarkan kepada rentetan sepadan.
Pemulangan nilai
suntingFungsi boleh menerima input, memanipulasinya dan menyerahkan semula output. Anda sudahpun tahu bagaimana fungsi dapat menerima input (yakni melalui parameter) dan memanipulasinya (melalui badan fungsi). Fungsi juga boleh memulangkan output dengan memulangkan satu atau lebih nilai pelbagai jenis. Ini dilakukan dengan pernyataan return
. Inilah sebabnya panggilan fungsi dianggap pernyataan dan ungkapan: panggilan-panggilan fungsi boleh dilaksanakan, akan tetapi panggilan fungsi juga boleh dinilai.
local function tambah(nombor_pertama, nombor_kedua)
return nombor_pertama, nombor_kedua -- pernyataan 'return'
end
print(tambah(5, 6)) -- panggilan fungsi (print) ditulis sebagai 'pernyataan'
Kod dalam fungsi di atas akan mula-mula menilai fungsi tambah
. Kemudian ia akan memanggil fungsi tambah
dengan nombor 5 dan 6 sebagai nilai. Fungsi akan mencampur nombor-nombor tersebut (5 tambah 6) dan memulangkan hasilnya yang kemudian akan dicetak. Inilah sebabnya kod di atas akan mencetak 11. Fungsi juga boleh memulangkan banyak nilai jika ungkapan-ungkapan yang terkandung di dalamnya dipisahkan dengan tanda koma.