Library-Library Pada C
26.2 Library-Library Pada C
Suatu library Lua adalah suatu chunk yang mendefinisikan beberapa fungsi Lua dan menyimpannya pada tempat yang sesuai, yang biasanya sebagai masukan (entries) pada suatu tabel. Sebuah library Lua meniru tindakan ini. Disamping definisi dari fungsi C itu sendiri, fungsi tersebut harus dapat mendefinisikan fungsi khusus yang disesuaikan dengan chunk utama dari library Lua. Sekali dipanggil, fungsi tersebut me-register semua fungsi C dari library dan menyimpannya pada tempat yang sesuai. Seperti sebuah chunk Lua yang utama, fungsi tersebut juga dapat menginisialisasi hal-hal lain yang memang memerlukan inisialisasi di dalam library.
Lua “melihat” fungsi-fungsi C melalui proses pendaftaran. Sekali fungsi C digambarkan dan disimpan di dalam Lua, sebuah program Lua memanggilnya melalui referensi langsung ke alamatnya (yaitu apa yang kita berikan kepada Lua saat kita mendaftarkan sebuah fungsi). Dengan kata lain, Lua tidak tergantung pada suatu nama fungsi, lokasi / penempatan paket atau aturan penglihatan untuk memanggil sebuah fungsi, sekalipun sudah didaftarkan / di-register. Khususnya, sebuah library C memiliki satu fungsi umum (public) yang tunggal, yang mana fungsi tersebut membuka library. Semua fungsi lainnya mungkin bersifat private, yang diumumkan sebagai static pada C.
Saat anda memperluas Lua dengan menggunakan fungsi C, itu merupakan suatu gagasan yang baik untuk merancang kode anda sebagai sebuah library C, walaupun saat anda hanya ingin me-register satu fungsi C. Cepat atau lambat (pada umumnya lebih cepat) anda akan membutuhkan fungsi-fungsi lainnya. Seperti biasa, bantuan library menawarkan suatu fungsi penolong (help) untuk pekerjaan ini. Fungsi luaL_openlib menerima sebuah daftar dari fungsi-fungsi C dan nama mereka masing-masing serta me-register semuanya di dalam sebuah table dengan nama library-nya. Sebagai contoh, jika kita ingin membuat sebuah library dengan fungsi l_dir yang telah kita definisikan sebelumnya. Pertama, kita harus mendefinisikan fungsi-fungsi library :
static int l_dir (lua_State *L) { ... /* as before */ }
Setelah itu, kita mendeklarasikan sebuah array dengan semua fungsi-fungsinya dan nama mereka masing-masing. Array ini memiliki elemen-elemen dari tipe luaL_reg, yang mana merupakan sebuah struktur yang terdiri dari dua jenis, yaitu string dan fungsi pointer.
static const struct luaL_reg mylib [] = { {"dir", l_dir}, {NULL, NULL} /* sentinel */
Pada contoh di sini, hanya terdapat satu fungsi ( l_dir) yang dideklarasikan. Memperhatikan bahwa pemasangan terakhir pada array seharusnya {NULL, NULL}, untuk memberi tanda bahwa proses telah berkahir. Pada akhirnya, kita mendeklarasikan sebuah fungsi utama, menggunakan luaL_ openlib :
int luaopen_mylib (lua_State *L) { luaL_openlib(L, "mylib", mylib, 0); return 1;
Argumentasi kedua untuk luaL_openlib adalah nama library-nya. Fungsi ini membuat (atau menggunakan kembali) sebuah tabel dengan nama yang telah diberikan, dan mengisinya Argumentasi kedua untuk luaL_openlib adalah nama library-nya. Fungsi ini membuat (atau menggunakan kembali) sebuah tabel dengan nama yang telah diberikan, dan mengisinya
Setelah menyelesaikan library , kita harus menghubungkannya kepada interpreter. Cara yang paling menyenangkan untuk melakukannya adalah dengan fasilitas penghubung dinamis (dynamic linking) , jika interpreter Lua anda mendukung fasilitas ini. (Ingat pembicaraan tentang dynamic linking pada bagian 8.2). Pada kasus ini, anda harus membuat sebuah library dinamis (dynamic library) dengan kode anda (sebuah file .dll pada Windows, sebuah file .so pada Linux). Setelah itu, anda dapat mengisi library anda secara langsung dari dalam Lua, dengan menggunakan loadlib. Panggilan tersebut adalah
mylib = loadlib("fullname-of-your-library", "luaopen_mylib")
mengubah fungsi luaopen_mylib menjadi sebuah fungsi C di dalam Lua dan menugaskan fungsi ini ke mylib. (Hal ini menjelaskan mengapa luaopen_mylib harus memiliki prototipe yang sama dengan fungsi C lainnya). Kemudian, panggilan mylib() menjalankan luaopen_mylib, untuk membuka library.
Jika interpreter anda tidak didukung oleh penghubung dinamis (dynamic linking), maka anda harus meng-compile kembali Lua dengan library anda yang baru. Di samping itu, anda memerlukan beberapa cara untuk memberitahu interpreter yang berdiri sendiri bahwa interpreter perlu membuka library ini saat membuka sebuah status baru. Beberapa makro memberi fasilitas pada tugas ini. Pertama, anda harus membuat sebuah header file (sebut saja mylib.h) dengan isi sebagai berikut :
int luaopen_mylib (lua_State *L);
#define LUA_EXTRALIBS { "mylib", luaopen_mylib },
Baris pertama mendeklarasikan fungsi yang dibuka. Baris selanjutnya mendefinisikan makro LUA_EXTRALIBS sebagai sebuah masukan di dalam array dari fungsi yang interpreter panggil saat membuat sebuah status baru. (Array ini memiliki tipe struct luaL_re[ ], jadi kita perlu memasukkan sebuah nama di sana).
Untuk memasukkan header file ini pada interpreter, anda dapat mendefinisikan makro LUA_USERCONFIG pada pilihan compiler anda. Untuk sebuah compiler command-line, anda harus menambahkan sebuah pilihan seperti
-DLUA_USERCONFIG=\"mylib.h\"
(tanda backslash melindungi tanda kutip dari shell; tanda kutip tersebut diperlukan pada C saat kita menetapkan sebuah nama file). Pada suatu pengembangan lingkungan yang terintegrasi, anda harus menambahkan sesuatu yang hampir sama di dalam setting proyek. Kemudian, saat anda meng- (tanda backslash melindungi tanda kutip dari shell; tanda kutip tersebut diperlukan pada C saat kita menetapkan sebuah nama file). Pada suatu pengembangan lingkungan yang terintegrasi, anda harus menambahkan sesuatu yang hampir sama di dalam setting proyek. Kemudian, saat anda meng-