Ana Sayfa

Lua Fonksiyonlarından C Callback'leri Oluşturma

1 dk okuma

Lua ve C arasındaki etkileşimi sağlarken karşılaşılan önemli zorluklardan biri, Lua fonksiyonlarından C callback'leri oluşturmaktır. Özellikle Windows C API'sini Lua'ya köprülerken WNDPROC gibi kritik fonksiyonların kullanılabilirliği için bu yetenek vazgeçilmezdir. Lua 5.4, JavaScript'e benzer şekilde closure ve leksik kapsam özelliklerine sahiptir; yani bir fonksiyon oluşturulduğunda, dış kapsamdaki değişkenleri ('up values' olarak adlandırılır) kendi içine dahil edebilir. Örneğin, local a = 1; local f = function(b) return a + b end yapısında f fonksiyonu a değişkenini kapsar.

Öte yandan, C dilinde closure kavramı bulunmamaktadır. Ancak, fonksiyonlar ve ham bellek işaretçileri sayesinde bu işlevsellik taklit edilebilir. C'de callback fonksiyonlarına veri aktarımı genellikle void *ctx işaretçisi aracılığıyla manuel olarak yapılır. Bu yaklaşımda, çağıran ve callback fonksiyonları işaretçinin gerçek tipini bilirken, aradaki fonksiyon onu sadece genel bir void *ctx olarak iletir. Makalede, int cb(void *ctx, int b) örneğiyle bu temel mekanizma açıklanmıştır.

İdeal bir köprüleme API'si, bir Lua fonksiyonunu C callback tipini temsil eden başka bir Lua fonksiyonuna geçirerek, dinamik olarak oluşturulmuş bir C fonksiyonuna işaret eden bir void* döndürmeyi hedefler. Yazar, bu yaklaşımı WNDPROC(function(...) ... end) örneğiyle göstermektedir. Bu ideal API'nin basit bir uygulaması için CALLBACK ve Add adında iki yeni fonksiyon tanıtılır. CALLBACK, bir Lua fonksiyonunu alır ve bir C fonksiyonu döndürürken, Add C callback'ini ve bir tamsayıyı alarak C içinden çalıştırır. REAL_CALLBACK adındaki C fonksiyonu, Lua fonksiyonunu Lua registry'sinden findex aracılığıyla alır, argümanları yığına iter, lua_call ile Lua fonksiyonunu çağırır ve sonucunu C tamsayısı olarak döndürür. Bu yöntem, WNDPROC gibi karmaşık yapıların basitleştirilmiş bir varyantını oluşturmak için yeterlidir.

İçgörü

Bu teknik, Lua ve C dilleri arasında güçlü bir etkileşim kurarak, özellikle sistem seviyesi API'lerin Lua ortamında kullanılmasını mümkün kılar.

Kaynak