سؤال

أنا أكتب مترجم تجريبي في اللغة.ثلاثة من أهم بنيات اللغة هي التعاريف البيانات والتعبيرات.التعاريف يمكن أن تحتوي على البيانات والتعبيرات, البيانات يمكن أن تحتوي على التعاريف والتعابير ، و نوع واحد من التعبير يمكن أن تحتوي على البيانات.أنا أمثل كل من الاتحاد أنواع لذا يمكن بسهولة استخدام مطابقة النقش عليها.من الناحية المثالية, وأود أن وضع رمز هذه في ملفات مختلفة ، ولكن OMake يشكو تبعية دائرية القضايا.بقدر ما أعرف, دائري نوع التعاريف عبر وحدات لا يسمح.

الطريقة الوحيدة التي أعرف من حل هذا هو تعريف الأنواع الثلاثة في آن واحد:

type defn = ...
and stmt = ...
and expr = ...

يبدو أن هذا يتطلب كل رمز لأنواع أن تكون في نفس الملف.هل هناك أي طريقة للتغلب على هذا ؟ كيف تتعامل مع التعميم التعاريف الواردة في التعليمات البرمجية الخاصة بك?

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

المحلول

عودي التعاريف تحتاج أن تظهر في نفس الملف.إذا كنت ترغب في فصل التعاريف البيانات والتعبيرات إلى وحدات منفصلة ، يمكنك القيام بذلك باستخدام عودي وحدات, ولكن سوف لا تزال بحاجة إلى أن تظهر في نفس الملف.جدول أعمال التنمية-ifying بين تبعيات الملف هو واحد من مضايقات من OCaml.

نصائح أخرى

هذا هو حلها بسهولة عن طريق parameterizing الخاص بك الأنواع على الأنواع أنها تشير إلى:

type ('stmt, 'expr) defn = ...
type ('defn, 'expr) stmt = ...
type ('defn, 'stmt) expr = ...

وتسمى هذه التقنية "فك العودية عقدة" (في إشارة إلى المستعصية عقدة) و كان هو موضح في OCaml مجلة المادة.

الهتافات ، جون هاروب.

حل آخر غالبا ما تستخدم هي مجردة أنواع في الواجهات.منذ أنواع مجردة في واجهات هذه الواجهات لا تعتمد بشكل متكرر.في التطبيقات ، يمكنك تحديد أنواع و منذ تطبيقات تعتمد فقط على واجهات, فهي ليست متكررة أيضا.

المشكلة الوحيدة هي أن هذا الحل لا يمكن بعد الآن مطابقة النقش على هذه الأنواع خارج تنفيذها.

شخصيا, ولكن ربما يكون مسألة ذوق ، أحب أن يكون جميع أنواع من البرنامج المحدد في وحدة واحدة (أعتقد أنه يساعد في قراءة من البرنامج).لذلك هذا التقييد من OCaml ليس حقا مشكلة بالنسبة لي.

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