ترقية FPARSEC: ترقية النقابات المميزة لتلبية قيود المساواة/المقارنة الجديدة

StackOverflow https://stackoverflow.com/questions/2290103

سؤال

لذلك ، بواسطة أ مرحبالارسلسلة من الأحداث, ، قمت بتنزيل مصدر FPARSEC وحاولت بنائه. لسوء الحظ ، لا يتوافق مع 1.9.9.9 الجديد. لقد أصلحت المشكلات السهلة ، ولكن هناك بعض النقابات المميزة التي لا تزال لا تعمل.

خاصة، دون سيم بوست يوضح أن النقابات المميزة التي تحتوي على عناصر من النوع obj أو -> لا تحصل تلقائيًا على قيود المساواة أو المقارنة ، لأن الكائنات لا تدعم المقارنة ولا تدعم الوظائف المساواة أيضًا. (ليس من الواضح ما إذا كانت المساواة/المقارنة التي تم إنشاؤها تلقائيًا عربات التي تجرها الدواب من قبل ، لكن الكود لن يتم تجميعه حتى الآن لم يعد يتم إنشاؤه.)

فيما يلي بعض الأمثلة على DUS الإشكالية:

type PrecedenceParserOp<'a,'u'> =
     | PrefixOp of string * Parser<unit,'u> * int * bool * ('a -> 'a)
     | others ...

type ErrorMessage =
     | ...
     | OtherError of obj
     | ...

فيما يلي الاستخدامات المخالفة:

member t.RemoveOperator (op: PrecedenceParserOp<'a, 'u>) =
    // some code ...
    if top.OriginalOp <> op then false // requires equality constraint
    // etc etc ...

أو لقيود المقارنة

let rec printMessages (pos: Pos) (msgs: ErrorMessage list) ind =
    // other code ...
    for msg in Set.ofList msgs do // iterate over ordered unique messages
        // etc etc ...

بقدر ما أستطيع أن أقول ، فإن حل دون لعلامة كل مثيل مع int فريدة من نوعها هي الطريقة الصحيحة لتنفيذ قيود مخصصة للمساواة/المقارنة (أو ربما يكون int فريد من نوعه بحيث يمكن طلب الفروع الفردية من DU). ولكن هذا غير مريح لمستخدم DU. الآن ، يتطلب بناء DU استدعاء وظيفة للحصول على الطابع التالي.

هل هناك طريقة لإخفاء الحصول على العلامات وتقديم نفس البنائين لمستخدمي المكتبة؟ وهذا هو ، لتغيير التنفيذ دون تغيير الواجهة؟ هذا مهم بشكل خاص لأنه يظهر (مما أفهمه من الكود) PrecedenceParserOp هو نوع عام.

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

المحلول

ما هو المصدر الذي قمت بتنزيله لـ FPARSEC؟ أمسكت بالأحدث من fparsec مستودع Bitbucket, ، ولم يكن عليّ إجراء أي تغييرات على الإطلاق على مصدر FPARSEC لجعله يجمع في VS 2010 RC.

تحرير: أنا أعود. لقد حصلت على أخطاء في بناء مشاريع عينة interplexyacc و interpfparsec ، ولكن مشاريع FPARSEC و FPARSECCS الأساسية تبني على ما يرام.

نصائح أخرى

شيء واحد يمكنك القيام به هو إضافة [<CustomEquality>] و [<CustomComparison>] السمات وتحديد خاصتك .Equals تجاوز و IComparable تطبيق. بالطبع ، سيتطلب منك التعامل مع obj و _ -> _ المكونات بنفسك بطريقة مناسبة ، والتي قد تكون أو لا تكون ممكنة. إذا كنت تستطيع التحكم في ما يتم تمريره إلى OtherError مُنشئ ، يجب أن تكون قادرًا على القيام بهذا العمل من أجل ErrorMessage اكتب عن طريق الخروج obj إلى نوع هو نفسه مماثل هيكليا. ومع ذلك ، فإن PrecendenceParserOp الحالة أكثر صعوبة بعض الشيء - قد تكون قادرًا على الاستفادة من استخدام المساواة المرجعية على مكونات الوظائف طالما أنك لا تحتاج إلى مقارنة أيضًا.

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