سؤال

ما الذي تشير إليه حالة الكتابة فيما يتعلق بتصميم اللغة?رأيت أنه ذكر في بعض المناقشات بشأن لغة جديدة من قبل موزيلا تسمى الصدأ.

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

المحلول

ملاحظة: تم إسقاط حالة الكتابة من الصدأ ، ولم يتبق سوى إصدار محدود (تتبع غير مهيأ وانتقل من المتغيرات).انظر ملاحظتي في النهاية.

الدافع وراء اكتبالدولة هل هذه الأنواع غير قابلة للتغيير ، ولكن بعض خصائصها ديناميكية ، على أساس كل متغير.

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

لا يتم التحقق من هذه المسندات في الواقع من قبل المترجم نفسه ، يمكن أن يكون مرهقا جدا ، بدلا من ذلك سوف المترجم ببساطة أسباب من حيث الرسم البياني.

كمثال بسيط ، يمكنك إنشاء المسند even, ، الذي يعود true إذا كان الرقم هو حتى.

الآن ، يمكنك إنشاء وظيفتين:

  • halve, ، الذي يعمل فقط على even أرقام
  • double, ، والتي تأخذ أي رقم ، وإرجاع even رقم.

لاحظ أن النوع number لم يتم تغيير ، لم تقم بإنشاء evennumber اكتب وتكرار كل تلك الوظائف التي عملت سابقا على number.أنت فقط تؤلف number مع المسند يسمى even.

الآن ، دعونا نبني بعض الرسوم البيانية:

a: number -> halve(a)  #! error: `a` is not `even`

a: number, even -> halve(a)  # ok

a: number -> b = double(a) -> b: number, even

بسيط, أليس كذلك ?

بالطبع يصبح الأمر أكثر تعقيدا عندما يكون لديك العديد من المسارات الممكنة:

a: number -> a = double(a) -> a: number, even -> halve(a) #! error: `a` is not `even`
          \___________________________________/

هذا يدل على أنك السبب من حيث مجموعات من المسندات:

  • عند الانضمام إلى مسارين ، فإن المجموعة الجديدة من المسندات هي تقاطع مجموعات المسندات المعطاة بواسطة هذين المسارين

يمكن زيادة ذلك من خلال القاعدة العامة للدالة:

  • لاستدعاء وظيفة، يجب أن تكون مجموعة المسندات التي تتطلبها راضية
  • بعد استدعاء دالة ، يتم استيفاء مجموعة المسندات التي أنشأتها فقط (ملاحظة:الحجج التي اتخذت من حيث القيمة لا تتأثر)

وبالتالي لبنة بناء اكتبالدولة في الصدأ:

  • check:يتحقق من أن المسند يحمل ، إذا لم يحدث ذلك fail, ، وإلا يضيف المسند إلى مجموعة من المسندات

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


ما نوعنقص الدولة بسيط:التركيب.

إذا قرأت الوصف بعناية ، فسوف تلاحظ ذلك:

  • بعد استدعاء دالة ، يتم استيفاء مجموعة المسندات التي أنشأتها فقط (ملاحظة:الحجج التي اتخذت من حيث القيمة لا تتأثر)

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

وهذا قد يؤدي إلى تكرار الدوال بمعدل أسي عندما تنبثق المسندات الجديدة:المسندات ليست ، للأسف ، قابلة للتكوين.لا يبدو أن مسألة التصميم ذاتها التي كان من المفترض معالجتها (انتشار الأنواع ، وبالتالي الوظائف) ، قد تم تناولها.

نصائح أخرى

إنه في الأساس امتدادا من الأنواع، حيث لا تحقق فقط ما إذا كانت بعض العملية مسموح بها بشكل عام، ولكن في هذا السياق المحدد.كل ذلك في وقت compile.

href="http://www.cs.cmu.edu/~aldrich/papers/classic/tse12-typestate.pdf" rel="noreferrer"> الورق الأصلي هو في الواقع قابل للقراءة تماماوبعد

هناك مدقق ترجمة مكتوبة Java، و الصفحة التوضيحية Adam Warski يعطيبعض المعلومات المفيدة.أنا فقط معرفة هذه المواد فقط من نفسي، ولكن إذا كنت على دراية بخدمة Quickcheck ل Haskell، فإن تطبيق QuickCheck إلى ولاية Monadic يبدو مشابها: يصنف الولايات وشرح كيف يتغيرون عند تغييره عبر الواجهة.

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