Memanggil Fungsi Lua
25.2. Memanggil Fungsi Lua
Kelebihan Lua adalah bahwa file konfigurasi dapat mendefinisikan fungsi agar dapat dipanggil oleh aplikasi tersebut. Sebagai contoh, anda dapat menulis suatu aplikasi untuk merencanakan grafik dari suatu fungsi dan menggunakan Lua untuk menggambarkan fungsi yang direncanakan.
Lampiran API untuk memanggil fungsi sangatlah sederhana: Pertama, anda mendorong fungsi untuk dipanggil. Kedua, anda mendorong sebuah argumen kepada panggilan. Kemudian anda menggunakan lua_pcall untuk melakukan panggilan yang sebenarnya. Dan akhirnya, anda mengeluarkan (pop) hasilnya dari stack.
Sebagai suatu contoh, mari kita berasumsi bahwa file konfigurasi milik kita mempunyai suatu fungsi seperti : Sebagai suatu contoh, mari kita berasumsi bahwa file konfigurasi milik kita mempunyai suatu fungsi seperti :
dan anda ingin mengevaluasi di dalam C, z = f(x,y) untuk nilai x dan y yang diberikan. Anggap saja anda telah membuka library Lua dan menjalankan file konfigurasi, anda dapat merangkum jenis panggilan ini pada fungsi C berikut :
/* call a function `f' defined in Lua */ double f (double x, double y) {
double z;
/* push functions and arguments */ lua_getglobal(L, "f"); /* function to be called */ lua_pushnumber(L, x); /* push 1st argument */ lua_pushnumber(L, y); /* push 2nd argument */
/* do the call (2 arguments, 1 result) */ if (lua_pcall(L, 2, 1, 0) != 0) error(L, "error running function `f': %s",
lua_tostring(L, -1));
/* retrieve result */ if (!lua_isnumber(L, -1)) error(L, "function `f' must return a number"); z = lua_tonumber(L, -1); lua_pop(L, 1); /* pop returned value */ return z;
Anda memanggil lua_pcall dengan banyaknya argumen yang dilewatkan dan banyaknya hasil yang diinginkan. Argumen yang keempat menunjukkan adanya fungsi penganganan kesalahan (error handling) , kita akan segera membicarakannya. Seperti bentuk penugasan di dalam Lua, lua_pcall mengatur jumlah hasil yang sebenarnya dengan apa yang telah diminta, memasukkan (push) nil atau membuang nilai lebih seperti yang dibutuhkan. Sebelum mendorong hasilnya, lua_pcall memindahkan fungsi-fungsi dan argumentsinya dari stack. Jika fungsi-fungsi tersebut mengembalikan bermacam-macam hasil, hasil pertama akan dimasukkan pada saat yang paling pertama. Maka jika terdapat n-hasil, hasil yang pertama yang akan menempati indeks -n dan hasil yang terakhir yang akan menempati indeks -1.
Jika terdapat error pada saat lua_pcall sedang berjalan (running), lua_pcall akan kembali ke nilai yang berbeda dari nol. Lebih dari itu, lua_pcall mendorong error message pada stack (tetapi tetap mengeluarkan fungsi dan argumentasinya). Sebelum mendorong pesannya, lua_pcall memanggil fungsi error handling, jika ada. Untuk menetapkan fungsi error handling, kita dapat menggunakan argument terakhir dari lua_pcall. Nilai nol (zero) menyatakan tidak ada fungsi error handling, itu sebabnya error message terakhir merupakan pesan yang asli. Selain itu, argumen tersebut harus merupakan indeks di dalam stack, dimana fungsi error handling ditempatkan. Memperhatikan hal itu, pada beberapa kasus, penanganan tersebut harus didorong ke dalam stack sebelum fungsi dipanggil dan menyatakan argumentasinya.
Untuk kesalahan yang normal, lua_pcall mengembalikan kode error LUA_ERRRUN. Dua macam kesalahan khusus dapat menerima kode yang berbeda, karena mereka tidak menjalankan fungsi penanganan kesalahan (error handler). Kesalahan yang pertama adalah kesalahan pengalokasian memori. Untuk kesalahan semacam itu, lua_pcall selalu mengembalikan LUA_ERRMEM. Kesalahan yang kedua adalah kesalahan pada saat Lua sedang menjalankan fungsi penanganan kesalahan (error handler) itu sendiri. Pada kondisi seperti itu, pemanggilan ulang terhadap error handler tidak cukup membantu mengatasi error tersebut, sehingga lua_pcall akan segera kembali dengan kode LUA_ERRERR.