Lua API এর মাধ্যমে C/C++ এর সাথে Interaction

Embedding Lua (এম্বেডিং লুয়া) - লুয়া (Lua) - Computer Programming

358

লুয়া (Lua) একটি শক্তিশালী স্ক্রিপ্টিং ভাষা যা সহজেই C বা C++ প্রোগ্রামের সাথে ইন্টিগ্রেট করা যেতে পারে। লুয়া C API সরবরাহ করে, যা ব্যবহার করে C বা C++ প্রোগ্রামে লুয়া স্ক্রিপ্ট ইন্টারপ্রেট করা, লুয়া ফাংশন কল করা, এবং লুয়া থেকে ডেটা পাঠানো বা গ্রহণ করা সম্ভব হয়।

এই টিউটোরিয়ালে, আমরা লুয়া API ব্যবহার করে C এবং C++ এর সাথে ইন্টারঅ্যাকশন করার মৌলিক ধারণা এবং কোড উদাহরণ দেখব।


১. লুয়া ইন্টারপ্রেটার C/C++ এ ইন্টিগ্রেট করা

লুয়া স্ক্রিপ্ট ইন্টারপ্রেট করার জন্য C/C++ কোডে লুয়া ইন্টারপ্রেটার ব্যবহার করা হয়। এর জন্য লুয়া স্টেট (lua_State) ব্যবহার করা হয়, যা লুয়া স্ক্রিপ্টের অবস্থা ধারণ করে। আপনি luaL_newstate() দিয়ে একটি নতুন লুয়া স্টেট তৈরি করবেন এবং luaL_openlibs() দিয়ে লাইব্রেরি লোড করবেন।

উদাহরণ: C প্রোগ্রামে লুয়া স্ক্রিপ্ট রান করা

#include <stdio.h>
#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>

int main() {
    // লুয়া স্টেট তৈরি করা
    lua_State *L = luaL_newstate();

    // লুয়া লাইব্রেরি লোড করা
    luaL_openlibs(L);

    // লুয়া স্ক্রিপ্ট লোড করা
    if (luaL_dofile(L, "script.lua") != LUA_OK) {
        printf("Error: %s\n", lua_tostring(L, -1));  // ত্রুটি বার্তা
    }

    // লুয়া স্টেট বন্ধ করা
    lua_close(L);

    return 0;
}

এখানে, luaL_dofile ফাংশনটি script.lua নামক লুয়া স্ক্রিপ্ট রান করবে এবং তার আউটপুট দেখাবে। যদি কোনো ত্রুটি ঘটে, তবে তা স্ক্রিপ্টে লোগ করা হবে।


২. C থেকে লুয়া ফাংশন কল করা

C প্রোগ্রাম থেকে লুয়া ফাংশন কল করার জন্য, lua_getglobal এবং lua_pcall ফাংশন ব্যবহার করা হয়। এই ফাংশনগুলি ব্যবহৃত হয় লুয়া স্টেট থেকে ফাংশন পুশ করে কল করার জন্য।

উদাহরণ: C থেকে লুয়া ফাংশন কল করা

#include <stdio.h>
#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>

int main() {
    lua_State *L = luaL_newstate();  // নতুন লুয়া স্টেট তৈরি

    luaL_openlibs(L);  // লুয়া লাইব্রেরি লোড

    // লুয়া স্ক্রিপ্ট লোড করা
    if (luaL_dofile(L, "script.lua") != LUA_OK) {
        printf("Error: %s\n", lua_tostring(L, -1));
        lua_close(L);
        return -1;
    }

    // লুয়া ফাংশন কল করা
    lua_getglobal(L, "add");  // "add" ফাংশন কল করতে লুয়া স্টেটে পুশ করা

    // ফাংশনে আর্গুমেন্ট পুশ করা (উদাহরণস্বরূপ, দুটি সংখ্যার যোগফল)
    lua_pushnumber(L, 10);  // প্রথম আর্গুমেন্ট
    lua_pushnumber(L, 20);  // দ্বিতীয় আর্গুমেন্ট

    // ফাংশন কল করা
    if (lua_pcall(L, 2, 1, 0) != LUA_OK) {
        printf("Error: %s\n", lua_tostring(L, -1));
        lua_close(L);
        return -1;
    }

    // রিটার্ন ভ্যালু বের করা
    double result = lua_tonumber(L, -1);
    printf("Result: %f\n", result);  // আউটপুট: Result: 30.000000

    lua_close(L);  // লুয়া স্টেট বন্ধ করা
    return 0;
}

এখানে, lua_getglobal দিয়ে লুয়া ফাংশন add কে কল করা হয়েছে এবং lua_pushnumber দিয়ে দুটি সংখ্যার আর্গুমেন্ট পুশ করা হয়েছে। lua_pcall এর মাধ্যমে ফাংশন কল হয়েছে এবং রিটার্ন ভ্যালু lua_tonumber দিয়ে গ্রহণ করা হয়েছে।


৩. লুয়া থেকে C এ ডেটা পাঠানো

লুয়া থেকে C প্রোগ্রামে ডেটা পাঠানোর জন্য lua_push ফাংশন ব্যবহার করা হয়। আপনি লুয়া স্ক্রিপ্ট থেকে C ফাংশনে ডেটা পাঠানোর সময় lua_tonumber, lua_tostring ইত্যাদি ফাংশন ব্যবহার করে ডেটার ধরন বুঝে ডেটা গ্রহণ করতে পারেন।

উদাহরণ: লুয়া থেকে C এ ডেটা পাঠানো

-- script.lua
function get_value()
    return 42, "Hello from Lua!"
end

এখন C প্রোগ্রাম থেকে লুয়া ফাংশন get_value কল করা হবে এবং তার রিটার্ন ভ্যালুগুলি গ্রহণ করা হবে।

#include <stdio.h>
#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>

int main() {
    lua_State *L = luaL_newstate();  // নতুন লুয়া স্টেট তৈরি

    luaL_openlibs(L);  // লুয়া লাইব্রেরি লোড

    // লুয়া স্ক্রিপ্ট লোড করা
    if (luaL_dofile(L, "script.lua") != LUA_OK) {
        printf("Error: %s\n", lua_tostring(L, -1));
        lua_close(L);
        return -1;
    }

    // লুয়া ফাংশন কল করা
    lua_getglobal(L, "get_value");  // "get_value" ফাংশন কল করতে লুয়া স্টেটে পুশ করা

    // ফাংশন কল করা
    if (lua_pcall(L, 0, 2, 0) != LUA_OK) {
        printf("Error: %s\n", lua_tostring(L, -1));
        lua_close(L);
        return -1;
    }

    // রিটার্ন ভ্যালু গ্রহণ
    double num = lua_tonumber(L, -2);  // প্রথম রিটার্ন ভ্যালু
    const char* str = lua_tostring(L, -1);  // দ্বিতীয় রিটার্ন ভ্যালু

    printf("Number: %f, String: %s\n", num, str);  // আউটপুট: Number: 42.000000, String: Hello from Lua!

    lua_close(L);  // লুয়া স্টেট বন্ধ করা
    return 0;
}

এখানে, get_value ফাংশন থেকে দুটি রিটার্ন ভ্যালু (একটি সংখ্যা এবং একটি স্ট্রিং) C প্রোগ্রামে গ্রহণ করা হয়েছে।


৪. C থেকে লুয়া কাস্টম ফাংশন রেজিস্টার করা

লুয়া স্ক্রিপ্টে C ফাংশন রেজিস্টার করতে lua_register ফাংশন ব্যবহার করা হয়। এটি C ফাংশনকে লুয়া স্ক্রিপ্টে একটি নতুন ফাংশন হিসেবে রেজিস্টার করে দেয়।

উদাহরণ: C থেকে লুয়া কাস্টম ফাংশন রেজিস্টার করা

#include <stdio.h>
#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>

// C ফাংশন
int add_numbers(lua_State *L) {
    double a = luaL_checknumber(L, 1);  // প্রথম আর্গুমেন্ট
    double b = luaL_checknumber(L, 2);  // দ্বিতীয় আর্গুমেন্ট
    lua_pushnumber(L, a + b);  // যোগফল পুশ করা
    return 1;  // ১টি রিটার্ন ভ্যালু
}

int main() {
    lua_State *L = luaL_newstate();  // নতুন লুয়া স্টেট তৈরি

    luaL_openlibs(L);  // লুয়া লাইব্রেরি লোড

    // C ফাংশন লুয়ায় রেজিস্টার করা
    lua_register(L, "add", add_numbers);

    // লুয়া স্ক্রিপ্ট লোড করা
    if (luaL_dofile(L, "script.lua") != LUA_OK) {
        printf("Error: %s\n", lua_tostring(L, -1));
        lua_close(L);
        return -1;
    }

    lua_close(L);  // লুয়া স্টেট বন্ধ করা
    return 0;
}

এখানে, add_numbers ফাংশনটি lua_register ফাংশন দিয়ে লুয়া স্ক্রিপ্টে `"

add"` নামের ফাংশন হিসেবে রেজিস্টার করা হয়েছে।


সারসংক্ষেপ

লুয়া API এর মাধ্যমে C/C++ প্রোগ্রাম এবং লুয়া স্ক্রিপ্টের মধ্যে ইন্টারঅ্যাকশন করা সম্ভব। এই ইন্টারঅ্যাকশন মাধ্যমে আপনি:

  1. লুয়া স্ক্রিপ্ট রান করতে পারেন C/C++ এ।
  2. C থেকে লুয়া ফাংশন কল করতে পারেন এবং তার রিটার্ন ভ্যালু গ্রহণ করতে পারেন।
  3. লুয়া থেকে C এ ডেটা পাঠাতে এবং গ্রহণ করতে পারেন।
  4. C ফাংশনকে লুয়া স্ক্রিপ্টে কাস্টম ফাংশন হিসেবে রেজিস্টার করতে পারেন।

এই কার্যক্রমগুলি লুয়া এবং C/C++ এর মধ্যে শক্তিশালী এবং নমনীয় ইন্টারঅ্যাকশন তৈরি করতে সহায়তা করে।

Content added By
Promotion

Are you sure to start over?

Loading...