0Pricing
Lua Academy · درس

تسجيل دوال C في Lua

اعرض دوال C لنصوص Lua باستخدام luaL_register وlua_pushcfunction

تسجيل دوال C في Lua درس مجاني في Lua Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Lua Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Lua Academy 4 دروس في المجموع.

نظرة عامة

يمكن إتاحة دوال C للبرامج النصية في Lua. ويجب أن يكون توقيعها int myFunc(lua_State *L). فهي تقرأ الوسائط من المكدس وتدفع قيم الإرجاع إليه.

توقيع دالة C

كل دالة قابلة للاستدعاء من Lua هي lua_CFunction: تتلقى lua_State*، وتقرأ الوسائط، وتدفع النتائج، وتعيد عدد النتائج.

// C code
static int l_add(lua_State *L) {
  double a = luaL_checknumber(L, 1);
  double b = luaL_checknumber(L, 2);
  lua_pushnumber(L, a + b);
  return 1;  // one result
}

التسجيل كدالة عامة

تدفع lua_pushcfunction(L, l_add) دالة C، ثم تسجلها lua_setglobal(L, "add") باعتبارها دالة عامة في Lua.

// C code
lua_pushcfunction(L, l_add);
lua_setglobal(L, "add");
// Now Lua can call: add(3, 4)

luaL_newlib / luaL_register

سجّلوا مجموعة من دوال C كوحدة Lua باستخدام مصفوفة luaL_Reg وluaL_newlib.

// C code
static const luaL_Reg mylib[] = {
  {"add", l_add},
  {"mul", l_mul},
  {NULL, NULL}
};
luaL_newlib(L, mylib);
lua_setglobal(L, "mylib");
// Lua: mylib.add(1, 2)

قراءة الوسائط

تقرأ luaL_checknumber(L, n) وluaL_checkstring(L, n) وغيرهما الوسائط وتتحقق من صحتها، وتثير خطأ Lua إذا كان النوع غير صحيح.

إرجاع قيم متعددة

ادفعوا قيمًا متعددة وأعيدوا عددها. وستعيّنها Lua باعتبارها قيم إرجاع متعددة.

// C code
static int l_divmod(lua_State *L) {
  int a = luaL_checkinteger(L, 1);
  int b = luaL_checkinteger(L, 2);
  lua_pushinteger(L, a / b);
  lua_pushinteger(L, a % b);
  return 2;  // two results
}

Upvalues لـ C Closures

تلتقط C closures قيم upvalues وقت التسجيل باستخدام lua_pushcclosure(L, fn, n). ويمكن الوصول إلى upvalues باستخدام lua_upvalueindex(n).

الإبلاغ عن الأخطاء من C

استدعوا luaL_error(L, format, ...) لإثارة خطأ Lua من دالة C. فهذا الاستدعاء لا يعيد قيمة مطلقًا، بل ينفذ longjmp إلى معالج الاستدعاء المحمي.

// C code
if (divisor == 0)
  luaL_error(L, "division by zero at argument %d", 2);

وحدة C بصيغة .so/.dll

تتيح وحدة C دالة luaopen_modname. ويحمّل require في Lua المكتبة المشتركة ويستدعيها لتهيئة الوحدة.

// C code (shared library entry point)
int luaopen_mymod(lua_State *L) {
  luaL_newlib(L, mymod_funcs);
  return 1;
}

التحقق من عدد الوسائط

استخدموا lua_gettop(L) للتحقق من عدد الوسائط المُمرّرة. وتضمن luaL_checkany(L, n) توفير n من الوسائط على الأقل.

بديل LuaJIT FFI

يتيح FFI في LuaJIT استدعاء دوال C مباشرة من Lua دون كتابة شيفرة تغليف بلغة C. وغالبًا ما يكون أبسط لاستدعاءات الدوال البحتة. أما C API فهو مطلوب للتكامل الأعمق.

سؤال حول دوال C

ما الذي يجب أن تعيده دالة C القابلة للاستدعاء من Lua؟

مراجعة: تسجيل دوال C

تملك دوال C القابلة للاستدعاء من Lua التوقيع int f(lua_State*). اقرأوا الوسائط باستخدام luaL_check*، وادفعوا النتائج، وأعيدوا العدد. سجّلوا الدوال منفردة باستخدام lua_pushcfunction أو دفعة واحدة باستخدام luaL_newlib.

الأسئلة الشائعة

هل درس «تسجيل دوال C في Lua» مجاني؟

نعم — نص درس «تسجيل دوال C في Lua» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Lua Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Lua Academy 4 دروس في المجموع.

ماذا ستتعلم في «تسجيل دوال C في Lua»؟

اعرض دوال C لنصوص Lua باستخدام luaL_register وlua_pushcfunction تتمرن على Lua Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Lua Academy؟

لا تُشترط خبرة سابقة. Lua Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.

كم من الوقت يستغرق درس «تسجيل دوال C في Lua»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Lua Academy هذا؟

نعم. كل درس في Lua Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. نموذج مكدس Lua C API
  2. استدعاء دوال Lua من C
  3. تسجيل دوال C في Lua
  4. إدارة الحالة ومعالجة الأخطاء
← العودة إلى Lua Academy