معلومات جيدة عن أنظمة النوع بناء على العقود / القيود؟
-
19-09-2019 - |
سؤال
مشكلة:
أنا أبحث عن مقدمة جيدة حول اكتب أنظمة، والتي تستند إلى العقود / القيود
(آسف، لا أتذكر المصطلح الذي مناسب لنظام النظام).
أحتاج إلى أن تكون المعلومات قادرة على تنفيذ نظام نوع تجريبي من هذا النوع.
بقدر ما أعرف، يتم استخدام هذا النظام من النوع XSD. (تعريف مخطط XML).
بدلا من تحديد نوع البيانات، يحدد المرء القيود على مجموعة القيم المحتملة.
مثال:
أعرف بعض الطريقة مع معلمة، أي إما "nothing"
, أو يطابق النطاق الكهربائي [0..100]
.
هذه الطريقة ستقبل القيم التالية:
"nothing"
0
1
...
100
آمل، يمكنني أن أجعل نفسي واضحة.
المحلول
يقدم LISP المشترك اختبار هذا النوع في مدة العرض. وبعد يحتوي على نظام من النوع الموضعي، لكنه غير مستخدم لأنه قد تكون معتادا على لغة مكتوبة ثابتة. ماكرو check-type
يقبل أ typespec., ، والتي يمكن أن تكون مواصفات مدمجة أو واحدة محددة من قبل الماكرو deftype
. وبعد القيود المعبرية مع Typespecs هي تلك الخاصة بدالة المسند المكتوبة في اللغة المضيفة، والتي ستقول أن أي شيء يمكنك فحص وقت التشغيل يمكن أن يكون معايير ما يشكل نوعك الجديد.
النظر في هذا المثال:
(defun is-nothing (val)
(when (stringp val)
(string= val "nothing")))
(deftype strange-range ()
"A number between 0 and 100 inclusive, or the string \"nothing\"."
'(or (integer 0 100)
(satisfies is-nothing)))
هذا يحدد نوع يسمى "المدى الغريب". الآن اختبار بعض القيم ضدها:
CL-USER> (let ((n 0))
(check-type n strange-range))
NIL
CL-USER> (let ((n 100))
(check-type n strange-range))
NIL
CL-USER> (let ((n "nothing"))
(check-type n strange-range))
NIL
CL-USER> (let ((n 101))
(check-type n strange-range))
آخر واحد يؤدي إلى تشغيل المصحح بالرسالة التالية:
The value of N should be of type STRANGE-RANGE.
The value is: 101
[Condition of type SIMPLE-TYPE-ERROR]
هذا واحد يثير نفس النتيجة:
CL-USER> (let ((n "something"))
(check-type n strange-range))
القيود التي يمكن للمرء أن تفرض هذه الطريقة عبارة عن تعبيرية، لكنها لا تخدم نفس الغرض من أن أنظمة النوع الموضحة لغات مثل Haskell أو Scala. في حين أن تعريفات النوع يمكنها اقتناع مترجم LISP المشترك ل EMIT Code مزيد من التصميم والكفاءة لأنواع المعاملات، فإن الأمثلة المذكورة أعلاه هي طريقة موجزة لكتابة الشيكات من نوع وقت التشغيل.
نصائح أخرى
هذا ليس منطقتي من خبرتي، لذلك قد يكون خارج الموضوع، لكن مايكروسوفت أبحاث لديها مشروع عقود الكود, ، والتي "توفر طريقة غير ملائمة للغة للتعبير عن افتراضات الترميز في البرامج.