تخطَّ إلى المحتوى

استدعاء C (FFI)

منقول من الكتاب المرجعي: docs/handbook/language/10-ffi.md · الإيداع 7a52f6c

القاعدة. خارجي "مكتبة" داله الاسم(المعامل نوع_C, ...) نوع_C باسم "اسم_C" في المستوى الأعلى يصرّح بدالة من مكتبة C؛ بلا مكتبة فهي من مكتبة C نفسها. الأنواع في التوقيع أنواع C (جدولها في المفردات). الرمز يُفحص قبل التشغيل: مفقود خطأ ترجمة برمز 2. --no-ffi يمنع خارجي في برنامج المستخدم (لا في المكتبة القياسية). التفصيل في stdlib-design.md (وثيقة في مستودع المجمّع) وlow-level.md (وثيقة في مستودع المجمّع).

  • نص يُمرَّر منتهياً بصفر؛ ونص ترجعه C يُنسخ (نص_مملوك: يُنسخ ثم يُحرَّر الأصل بـfree). نص_او_لاشيء يقبل NULL.
  • الأعداد بأحجامها: القيمة خارج مدى عدد32 خطأ تشغيل عند الاستدعاء.
  • منذ 0.7.0: هيكل_سي (تخطيط C، حجم_النوع يطابق sizeof) ومؤشر[هيكل_سي] في التوقيع، ونص_سي (char * بلا نسخ، مع نص_سي(ن[, م]) ومن_نص_سي(خ))، ودالة ميم تُمرَّر باسمها إلى C (استدعاء عكسي).
مثال
خارجي "m" داله جذر(س كسر) كسر باسم "sqrt"
خارجي داله طول_c(ن نص) حجم باسم "strlen"
هيكل_سي رأس:
نوع طبيعي8
طول عدد32
اطبع(جذر(2.0), " ", طول_c("ميم"), " ", حجم_النوع(رأس))
المخرج المسجَّل في الكتاب المرجعيmeem برنامج.م · 0.10.0
1.4142135623730951 6 8

القيود المعروفة. لا دوال متغيرة عدد الوسائط (printf). القوائم والقواميس والهياكل العادية لا تُمرَّر. دالة ميم إلى C تُمرَّر باسمها لا بمتغير. C التي تحتفظ بمؤشر نص بعد رجوعها مسؤولية كاتب التصريح.

أخطاء محتملة.

مثال
خارجي "m" داله غريبة(س كسر) كسر باسم "no_such_function_xyz"
اطبع(غريبة(1.0))
المخرج المسجَّل في الكتاب المرجعيmeem برنامج.م · 0.10.0
​[خطأ توليد الكود E0416] سطر 1:1 - الرمز 'no_such_function_xyz' غير موجود في المكتبة 'm' ولا في مكتبة C (تصريح الدالة الخارجية 'غريبة')   1 | خارجي "m" داله غريبة(س كسر) كسر باسم "no_such_function_xyz"     | ^~~~~  تلميح: تأكد من اسم الدالة في C بعد 'باسم'، ومن اسم المكتبة بعد 'خارجي'.

رمز الخروج: 2

في فهرس الأخطاء: E0416