Sebuah Contoh Pertama

24.1 Sebuah Contoh Pertama

Kami akan memulai gambaran ini dengan suatu contoh sederhana dari suatu program aplikasi, suatu Lua interpreter yang berdiri sendiri. Kami dapat menulis suatu primitif interpreter yang berdiri sendiri sebagai berikut:

#include <stdio.h> #include <lua.h> #include <lauxlib.h> #include <lualib.h> int main (void) {

char buff[256]; int error; lua_State *L = lua_open(); /* opens Lua */ luaopen_base(L); /* opens the basic library */ luaopen_table(L); /* opens the table library */ luaopen_io(L); /* opens the I/O library */ luaopen_string(L); /* opens the string lib. */ luaopen_math(L); /* opens the math lib. */ while (fgets(buff, sizeof(buff), stdin) != NULL) {

error = luaL_loadbuffer(L, buff, strlen(buff), "line") || lua_pcall(L, 0, 0, 0); if (error) { fprintf(stderr, "%s", lua_tostring(L, -1)); lua_pop(L, 1); /* pop error message from the stack */

} } lua_close(L); return 0;

Header file lua.h menggambarkan fungsi dasar yang disajikan oleh Lua. Meliputi fungsi untuk menciptakan suatu lingkungan Lua baru ( seperti lua_open), untuk meminta fungsi Lua ( seperti lua_pcall), untuk membaca dan menulis variabel global di (dalam) lingkungan Lua, untuk mendaftarkan fungsi baru agar bisa dipanggil oleh Lua, dan seterusnya. Semuanya digambarkan di dalam lua.h sebagai awalan Lua.

Kepala file lauxlib.h menggambarkan fungsi yang disajikan oleh alat bantu library ( auxlib). Semua pendefinisian nya dimulai dengan luaL_ ( contohnya luaL_loadbuffer). Alat bantu library menggunakan dasar API yang disajikan oleh lua.h untuk menyediakan suatu tingkatan abstrak yang lebih tinggi, semua Lua standar library menggunakan auxlib . Dasar dari API digunakan dalam bidang ekonomi dan orthogonalitas, sedangkan auxlib mengejar praktek untuk tugas umum. Tentu saja, sangat mudah bagi program kami untuk menciptakan abstraksi lain yang diperlukan. Auxlib tidak punya akses untuk internal Lua. Ia mengerjakan seluruh pekerjaannya melalui official dasar API.

Lua library tidak menggambarkan variabel global sama sekali. Ia menampung state nya dalam struktur dinamis lua_State dan pointer untuk struktur ini dilewati sebagai suatu argumentasi bagi semua fungsi di dalam Lua. Implementasi ini membuat Lua masuk kembali dan siap untuk digunakan dalam kode multithreaded.

Fungsi lua_open menciptakan suatu lingkungan baru ( atau state). Ketika lua_open menciptakan suatu lingkungan baru, lingkungan ini berisi fungsi yang tidak dikenal, tidak saja mencetak. Untuk menyimpan Lua kecil, semua standar library disajikan sebagai paket terpisah, sedemikian sehingga kami tidak bisa menggunakannya jika kami tidak memerlukan. Kepala file lualib.h menggambarkan fungsi untuk membuka library tersebut. Panggilan ke luaopen_io, sebagai contoh, menciptakan tabel io dan mendaftarkan Fungsi I/O ( io.read, io.write, dll.) di dalam nya.

Setelah menciptakan suatu state dan memngumpulkannya dengan standar library, kemudian menginterpretasikan masukan pemakai. Untuk masing-masing garis yang pemakai masukan, pertama program akan memanggilan luaL_loadbuffer untuk menyusun kode tersebut. Jika tidak ada kesalahan, akan mengembalikan nol dan memasukkan hasil dari potongan pada stack. Kemudian program memanggil lua_pcall, yang mengeluarkan potongan dari stack dan menjalankannya dalam gaya dilindungi. Seperti luaL_loadbuffer, lua_pcall mengembalikan nol jika tidak ada kesalahan. Dalam hal kesalahan, kedua fungsi memasukkan suatu pemberitahu kesalahan pada tumpukan, kami mendapat pesan ini dengan lua_tostring dan setelah pencetakan, kami memindahkannya dari tumpukan dengan lua_pop.

Dalam hal kesalahan, program ini mencetak pemberitahu kesalahan ke standar error stream. penanganan kesalahan riil sangat kompleks dalam C dan bagaimana cara melakukannya tergantung pada sifat alami aplikasi kami. Lua core tidak pernah metulis secara langsung untuk output stream, ia memberi sinyal kesalahan dengan mengembalikan pemberitahu kesalahan dan kode kesalahan. Masing-Masing aplikasi mampu menangani isyarat ini dengan cara yang paling sesuai untuk kebutuhan nya. Sederhananya, kami mengasumsikan suatu penanganan kesalahan sederhana seperti berikut , yang mencetak suatu pemberitahu kesalahan, menutup state Lua, dan keluar dari aplikasi :

#include <stdarg.h> #include <stdio.h> #include <stdlib.h> void error (lua_State *L, const char *fmt, ...) { va_list

argp; va_start(argp, fmt); vfprintf(stderr, argp); va_end(argp); lua_close(L); exit(EXIT_FAILURE);

Karena kami dapat mengcompile Lua baik dengan C dan C++ kode, lua.h tidak meliputi kode penyesuaian khas yang menghadirkan beberapa C library yang lain :

#ifdef __cplusplus extern "C" { #endif ... #ifdef __cplusplus } #endif

Oleh karena itu, jika kami sudah meng-compile Lua pada kode C ( kasus yang paling umum) dan sedang menggunakannya dalam C++, kami harus menginclude lua.h sebagai berikut:

extern "C" { #include <lua.h> }

Suatu trik umum akan menciptakan suatu kepala file lua.hpp dengan kode diatas dan untuk memasukkan file baru ini dalam program C++ kami .