سؤال

كنت أحاول أن أفهم كيف روبي كتل العمل ، و ذلك كنت أحاول تنفيذها في C.

واحد طريقة سهلة لتنفيذ الإغلاق هو لتمرير void* إلى أرفق المكدس إلى إغلاق/وظيفة لكن روبي كتل أيضا يبدو أن التعامل مع عوائد وكسر البيانات من نطاق يستخدم كتلة.

loop do
  break i if (i >= 4000)
  i *= 2
end

أعتقد أن واحدة من الإغلاق مقترحات جافا يعمل مثل هذا أيضا.

لذا كيف يمكنك تنفيذ روبي-بنات/جافا-الإغلاق في C ؟

هل كانت مفيدة؟

المحلول

مفهوم الإغلاق يتطلب مفهوم السياقات.ج سياق يقوم على كومة سجلات وحدة المعالجة المركزية ، وذلك لخلق كتلة/الإغلاق ، تحتاج إلى أن تكون قادرة على التعامل مع مؤشر مكدس في الصحيح (reentrant) طريقة تخزين/استعادة السجلات حسب الحاجة.

الطريقة يتم ذلك عن طريق المترجمين أو الأجهزة الظاهرية هو أن يكون context هيكل أو شيئا من هذا القبيل ، وعدم استخدام المكدس و يسجل مباشرة.هذا الهيكل بتتبع كومة اختياريا بعض السجلات إذا كنت تصميم سجل على أساس VM.على الأقل هذا هو أبسط طريقة للقيام بذلك (وإن كان أقل قليلا performant من الواقع رسم الأشياء بشكل صحيح).

نصائح أخرى

في الواقع لم تنفذ أي شيء من هذا ، لذلك أعتبر مع كيس من الملح.

هناك نوعان من أجزاء الإغلاق:بيئة البيانات وقانون البيئة.كما قلت, ربما يمكنك تمرير باطل* التعامل مع إشارات إلى البيانات.ربما يمكن استخدام setjmp و longjmp لتنفيذ غير الخطية التحكم في التدفق يقفز إلى أن روبي كسر يتطلب.

إذا كنت تريد إغلاق ربما يجب أن تكون البرمجة بلغة الواقع يعتمد عليها.:-)

تحديث:أشياء مثيرة للاهتمام يحدث في رنة.لقد نموذج أولي الإغلاق على C. http://lists.cs.uiuc.edu/pipermail/cfe-dev/2008-August/002670.html قد تكون قراءة مثيرة للاهتمام.

هناك مجموعة جيدة من الشرائح على روبي كتل كجزء من "القضبان مع العاطفة" الحال:

Ruby_Blocks.pdf

هذا يغطي يمثلون كتلة, كيفية الحصول على تمرير الحجج و تنفيذها, و أبعد من ذلك في أشياء مثل بروك الكائنات.انها جدا شرح واضح.

فإنه قد يكون من الفائدة أن ننظر في كيفية JRuby الرجال التعامل مع هذه في تحليل جافا.نلقي نظرة على المصدر في codehaus.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top